byceps.announce.handlers.board   A
last analyzed

Complexity

Total Complexity 19

Size/Duplication

Total Lines 353
Duplicated Lines 53.26 %

Test Coverage

Coverage 99.09%

Importance

Changes 0
Metric Value
eloc 229
dl 188
loc 353
ccs 109
cts 110
cp 0.9909
rs 10
c 0
b 0
f 0
wmc 19

15 Functions

Rating   Name   Duplication   Size   Complexity  
A _get_board_label_segment() 0 6 2
A announce_board_posting_unhidden() 25 25 1
A _format_url() 0 2 2
A announce_board_topic_moved() 0 25 1
A announce_board_topic_unhidden() 23 23 1
A _escape_url_for_discord() 0 5 1
A announce_board_topic_unpinned() 23 23 1
A announce_board_topic_pinned() 23 23 1
A announce_board_posting_created() 0 26 2
A apply_selectors() 0 12 2
A announce_board_topic_unlocked() 23 23 1
A announce_board_topic_locked() 23 23 1
A announce_board_topic_created() 0 21 1
A announce_board_topic_hidden() 23 23 1
A announce_board_posting_hidden() 25 25 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
"""
2
byceps.announce.handlers.board
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
Announce board events.
6
7
:Copyright: 2014-2024 Jochen Kupperschmidt
8
:License: Revised BSD (see `LICENSE` file for details)
9
"""
10
11 1
from functools import wraps
12
13 1
from flask_babel import gettext
14
15 1
from byceps.announce.helpers import (
16
    get_screen_name_or_fallback,
17 1
    matches_selectors,
18
    with_locale,
19
)
20
from byceps.events.board import (
21
    _BoardEvent,
22 1
    BoardPostingCreatedEvent,
23
    BoardPostingHiddenEvent,
24
    BoardPostingUnhiddenEvent,
25
    BoardTopicCreatedEvent,
26
    BoardTopicHiddenEvent,
27
    BoardTopicLockedEvent,
28
    BoardTopicMovedEvent,
29
    BoardTopicPinnedEvent,
30
    BoardTopicUnhiddenEvent,
31
    BoardTopicUnlockedEvent,
32
    BoardTopicUnpinnedEvent,
33
)
34
from byceps.services.webhooks.models import Announcement, OutgoingWebhook
35
36 1
37
def apply_selectors(handler):
38
    @wraps(handler)
39 1
    def wrapper(
40 1
        event_name: str, event: _BoardEvent, webhook: OutgoingWebhook
41 1
    ) -> Announcement | None:
42
        board_id = str(event.board_id)
43
        if not matches_selectors(event_name, webhook, 'board_id', board_id):
44 1
            return None
45 1
46
        return handler(event_name, event, webhook)
47
48 1
    return wrapper
49
50 1
51
@apply_selectors
52
@with_locale
53 1
def announce_board_topic_created(
54 1
    event_name: str, event: BoardTopicCreatedEvent, webhook: OutgoingWebhook
55 1
) -> Announcement | None:
56
    """Announce that someone has created a board topic."""
57
    topic_creator_screen_name = get_screen_name_or_fallback(event.topic_creator)
58
    board_label_segment = _get_board_label_segment(
59 1
        event.brand.title, webhook.format
60
    )
61
    url = _format_url(event.url, webhook.format)
62 1
63
    text = gettext(
64
        '%(topic_creator_screen_name)s has created topic "%(topic_title)s"%(board_label_segment)s: %(url)s',
65 1
        topic_creator_screen_name=topic_creator_screen_name,
66
        board_label_segment=board_label_segment,
67 1
        topic_title=event.topic_title,
68
        url=url,
69
    )
70
71
    return Announcement(text)
72
73
74 View Code Duplication
@apply_selectors
75 1
@with_locale
76
def announce_board_topic_hidden(
77
    event_name: str, event: BoardTopicHiddenEvent, webhook: OutgoingWebhook
78 1
) -> Announcement | None:
79 1
    """Announce that a moderator has hidden a board topic."""
80 1
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
81
    topic_creator_screen_name = get_screen_name_or_fallback(event.topic_creator)
82
    board_label_segment = _get_board_label_segment(
83
        event.brand.title, webhook.format
84 1
    )
85
    url = _format_url(event.url, webhook.format)
86
87 1
    text = gettext(
88
        '%(moderator_screen_name)s has hidden topic "%(topic_title)s" by %(topic_creator_screen_name)s%(board_label_segment)s: %(url)s',
89
        moderator_screen_name=moderator_screen_name,
90 1
        board_label_segment=board_label_segment,
91
        topic_title=event.topic_title,
92
        topic_creator_screen_name=topic_creator_screen_name,
93 1
        url=url,
94
    )
95 1
96
    return Announcement(text)
97
98
99 View Code Duplication
@apply_selectors
100
@with_locale
101
def announce_board_topic_unhidden(
102
    event_name: str, event: BoardTopicUnhiddenEvent, webhook: OutgoingWebhook
103
) -> Announcement | None:
104 1
    """Announce that a moderator has made a board topic visible again."""
105
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
106
    topic_creator_screen_name = get_screen_name_or_fallback(event.topic_creator)
107 1
    board_label_segment = _get_board_label_segment(
108 1
        event.brand.title, webhook.format
109 1
    )
110
    url = _format_url(event.url, webhook.format)
111
112
    text = gettext(
113 1
        '%(moderator_screen_name)s has unhidden topic "%(topic_title)s" by %(topic_creator_screen_name)s%(board_label_segment)s: %(url)s',
114
        moderator_screen_name=moderator_screen_name,
115
        board_label_segment=board_label_segment,
116 1
        topic_title=event.topic_title,
117
        topic_creator_screen_name=topic_creator_screen_name,
118
        url=url,
119 1
    )
120
121
    return Announcement(text)
122 1
123
124 1 View Code Duplication
@apply_selectors
125
@with_locale
126
def announce_board_topic_locked(
127
    event_name: str, event: BoardTopicLockedEvent, webhook: OutgoingWebhook
128
) -> Announcement | None:
129
    """Announce that a moderator has locked a board topic."""
130
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
131
    topic_creator_screen_name = get_screen_name_or_fallback(event.topic_creator)
132
    board_label_segment = _get_board_label_segment(
133 1
        event.brand.title, webhook.format
134
    )
135
    url = _format_url(event.url, webhook.format)
136 1
137 1
    text = gettext(
138 1
        '%(moderator_screen_name)s has closed topic "%(topic_title)s" by %(topic_creator_screen_name)s%(board_label_segment)s: %(url)s',
139
        moderator_screen_name=moderator_screen_name,
140
        board_label_segment=board_label_segment,
141
        topic_title=event.topic_title,
142 1
        topic_creator_screen_name=topic_creator_screen_name,
143
        url=url,
144
    )
145 1
146
    return Announcement(text)
147
148 1
149 View Code Duplication
@apply_selectors
150
@with_locale
151 1
def announce_board_topic_unlocked(
152
    event_name: str, event: BoardTopicUnlockedEvent, webhook: OutgoingWebhook
153 1
) -> Announcement | None:
154
    """Announce that a moderator has unlocked a board topic."""
155
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
156
    topic_creator_screen_name = get_screen_name_or_fallback(event.topic_creator)
157
    board_label_segment = _get_board_label_segment(
158
        event.brand.title, webhook.format
159
    )
160
    url = _format_url(event.url, webhook.format)
161
162 1
    text = gettext(
163
        '%(moderator_screen_name)s has reopened topic "%(topic_title)s" by %(topic_creator_screen_name)s%(board_label_segment)s: %(url)s',
164
        moderator_screen_name=moderator_screen_name,
165 1
        board_label_segment=board_label_segment,
166 1
        topic_title=event.topic_title,
167 1
        topic_creator_screen_name=topic_creator_screen_name,
168
        url=url,
169
    )
170
171 1
    return Announcement(text)
172
173
174 1 View Code Duplication
@apply_selectors
175
@with_locale
176
def announce_board_topic_pinned(
177 1
    event_name: str, event: BoardTopicPinnedEvent, webhook: OutgoingWebhook
178
) -> Announcement | None:
179
    """Announce that a moderator has pinned a board topic."""
180 1
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
181
    topic_creator_screen_name = get_screen_name_or_fallback(event.topic_creator)
182 1
    board_label_segment = _get_board_label_segment(
183
        event.brand.title, webhook.format
184
    )
185
    url = _format_url(event.url, webhook.format)
186
187
    text = gettext(
188
        '%(moderator_screen_name)s has pinned topic "%(topic_title)s" by %(topic_creator_screen_name)s%(board_label_segment)s: %(url)s',
189
        moderator_screen_name=moderator_screen_name,
190
        board_label_segment=board_label_segment,
191 1
        topic_title=event.topic_title,
192
        topic_creator_screen_name=topic_creator_screen_name,
193
        url=url,
194 1
    )
195 1
196 1
    return Announcement(text)
197
198
199 View Code Duplication
@apply_selectors
200 1
@with_locale
201
def announce_board_topic_unpinned(
202
    event_name: str, event: BoardTopicUnpinnedEvent, webhook: OutgoingWebhook
203 1
) -> Announcement | None:
204
    """Announce that a moderator has unpinned a board topic."""
205
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
206 1
    topic_creator_screen_name = get_screen_name_or_fallback(event.topic_creator)
207
    board_label_segment = _get_board_label_segment(
208
        event.brand.title, webhook.format
209 1
    )
210
    url = _format_url(event.url, webhook.format)
211 1
212
    text = gettext(
213
        '%(moderator_screen_name)s has unpinned topic "%(topic_title)s" by %(topic_creator_screen_name)s%(board_label_segment)s: %(url)s',
214
        moderator_screen_name=moderator_screen_name,
215
        board_label_segment=board_label_segment,
216
        topic_title=event.topic_title,
217
        topic_creator_screen_name=topic_creator_screen_name,
218
        url=url,
219
    )
220 1
221
    return Announcement(text)
222
223 1
224 1
@apply_selectors
225 1
@with_locale
226
def announce_board_topic_moved(
227
    event_name: str, event: BoardTopicMovedEvent, webhook: OutgoingWebhook
228
) -> Announcement | None:
229 1
    """Announce that a moderator has moved a board topic to another category."""
230
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
231
    topic_creator_screen_name = get_screen_name_or_fallback(event.topic_creator)
232 1
    board_label_segment = _get_board_label_segment(
233
        event.brand.title, webhook.format
234
    )
235 1
    url = _format_url(event.url, webhook.format)
236
237
    text = gettext(
238 1
        '%(moderator_screen_name)s has moved topic "%(topic_title)s" by %(topic_creator_screen_name)s from "%(old_category_title)s" to "%(new_category_title)s"%(board_label_segment)s: %(url)s',
239
        moderator_screen_name=moderator_screen_name,
240 1
        board_label_segment=board_label_segment,
241
        topic_title=event.topic_title,
242
        topic_creator_screen_name=topic_creator_screen_name,
243
        old_category_title=event.old_category_title,
244
        new_category_title=event.new_category_title,
245
        url=url,
246
    )
247
248
    return Announcement(text)
249 1
250
251
@apply_selectors
252 1
@with_locale
253 1
def announce_board_posting_created(
254 1
    event_name: str, event: BoardPostingCreatedEvent, webhook: OutgoingWebhook
255
) -> Announcement | None:
256
    """Announce that someone has created a board posting."""
257
    if event.topic_muted:
258 1
        return None
259
260
    posting_creator_screen_name = get_screen_name_or_fallback(
261 1
        event.posting_creator
262
    )
263
    board_label_segment = _get_board_label_segment(
264 1
        event.brand.title, webhook.format
265
    )
266
    url = _format_url(event.url, webhook.format)
267 1
268
    text = gettext(
269 1
        '%(posting_creator_screen_name)s replied in topic "%(topic_title)s"%(board_label_segment)s: %(url)s',
270
        posting_creator_screen_name=posting_creator_screen_name,
271
        board_label_segment=board_label_segment,
272
        topic_title=event.topic_title,
273
        url=url,
274
    )
275
276
    return Announcement(text)
277
278
279 View Code Duplication
@apply_selectors
280 1
@with_locale
281
def announce_board_posting_hidden(
282
    event_name: str, event: BoardPostingHiddenEvent, webhook: OutgoingWebhook
283 1
) -> Announcement | None:
284 1
    """Announce that a moderator has hidden a board posting."""
285 1
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
286
    posting_creator_screen_name = get_screen_name_or_fallback(
287
        event.posting_creator
288
    )
289 1
    board_label_segment = _get_board_label_segment(
290 1
        event.brand.title, webhook.format
291
    )
292 1
    url = _format_url(event.url, webhook.format)
293
294
    text = gettext(
295 1
        '%(moderator_screen_name)s has hidden a reply by %(posting_creator_screen_name)s in topic "%(topic_title)s"%(board_label_segment)s: %(url)s',
296
        moderator_screen_name=moderator_screen_name,
297
        board_label_segment=board_label_segment,
298 1
        posting_creator_screen_name=posting_creator_screen_name,
299
        topic_title=event.topic_title,
300 1
        url=url,
301
    )
302
303
    return Announcement(text)
304
305
306 View Code Duplication
@apply_selectors
307
@with_locale
308 1
def announce_board_posting_unhidden(
309
    event_name: str, event: BoardPostingUnhiddenEvent, webhook: OutgoingWebhook
310
) -> Announcement | None:
311 1
    """Announce that a moderator has made a board posting visible again."""
312 1
    moderator_screen_name = get_screen_name_or_fallback(event.moderator)
313 1
    posting_creator_screen_name = get_screen_name_or_fallback(
314
        event.posting_creator
315
    )
316
    board_label_segment = _get_board_label_segment(
317 1
        event.brand.title, webhook.format
318
    )
319
    url = _format_url(event.url, webhook.format)
320 1
321
    text = gettext(
322
        '%(moderator_screen_name)s has unhidden a reply by %(posting_creator_screen_name)s in topic "%(topic_title)s"%(board_label_segment)s: %(url)s',
323 1
        moderator_screen_name=moderator_screen_name,
324
        board_label_segment=board_label_segment,
325
        posting_creator_screen_name=posting_creator_screen_name,
326 1
        topic_title=event.topic_title,
327
        url=url,
328 1
    )
329
330
    return Announcement(text)
331
332
333
# helpers
334
335
336
def _get_board_label_segment(brand_title: str, webhook_format: str) -> str:
337 1
    if webhook_format != 'weitersager':
338
        return ''
339
340 1
    board_label = gettext('"%(brand_title)s" board', brand_title=brand_title)
341 1
    return gettext(' in %(board_label)s', board_label=board_label)
342 1
343
344
def _format_url(url: str, webhook_format: str) -> str:
345
    return _escape_url_for_discord(url) if webhook_format == 'discord' else url
346 1
347
348
def _escape_url_for_discord(url: str) -> str:
349 1
    """Wrap URL in angle brackets (``<…>``) as that prevents preview
350
    embedding on Discord.
351
    """
352
    return f'<{url}>'
353