Skip to content

Commit 67fad9e

Browse files
feat(reddit): add flair proecessing
1 parent ca53e5c commit 67fad9e

2 files changed

Lines changed: 102 additions & 12 deletions

File tree

src/reddit_bot/bot.py

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,12 +184,15 @@ def process_submission(self, submission: models.Submission):
184184
'created_utc': submission.created_utc,
185185
'permalink': submission.permalink,
186186
'url': submission.url,
187+
'link_flair_template_id': submission.link_flair_template_id if hasattr(
188+
submission, 'link_flair_template_id') else None,
187189
'link_flair_text': submission.link_flair_text if hasattr(submission, 'link_flair_text') else None,
188190
'link_flair_background_color': submission.link_flair_background_color if hasattr(
189191
submission, 'link_flair_background_color') else None,
190192
'bot_discord': existing_submission.get(
191193
'bot_discord', {'sent': False, 'sent_utc': None}),
192194
}
195+
submission_data = self.flair(submission=submission, submission_data=submission_data)
193196
submissions_table.update(submission_data, q.reddit_id == submission.id)
194197
return
195198

@@ -202,6 +205,8 @@ def process_submission(self, submission: models.Submission):
202205
'created_utc': submission.created_utc,
203206
'permalink': submission.permalink,
204207
'url': submission.url,
208+
'link_flair_template_id': submission.link_flair_template_id if hasattr(
209+
submission, 'link_flair_template_id') else None,
205210
'link_flair_text': submission.link_flair_text if hasattr(submission, 'link_flair_text') else None,
206211
'link_flair_background_color': submission.link_flair_background_color if hasattr(
207212
submission, 'link_flair_background_color') else None,
@@ -220,9 +225,9 @@ def process_submission(self, submission: models.Submission):
220225
except Exception:
221226
logger.exception("Error awarding XP")
222227

228+
submission_data = self.flair(submission=submission, submission_data=submission_data)
223229
if os.getenv('DISCORD_REDDIT_CHANNEL_ID'):
224230
submission_data = self.discord(submission=submission, submission_data=submission_data)
225-
submission_data = self.flair(submission=submission, submission_data=submission_data)
226231
submission_data = self.karma(submission=submission, submission_data=submission_data)
227232

228233
with self.db as db:
@@ -305,11 +310,12 @@ def discord(self, submission: models.Submission, submission_data: dict) -> dict:
305310
submission_data : dict
306311
The submission data to process.
307312
"""
308-
# get the flair color
309-
try:
310-
color = int(submission.link_flair_background_color, 16)
311-
except Exception:
312-
color = common.colors['white']
313+
flair_data = submission_data.get('flair', {})
314+
color = flair_data.get('color') or self.parse_flair_color(submission_data.get('link_flair_background_color'))
315+
316+
footer_parts = [f'Posted on r/{self.subreddit_name}']
317+
if flair_data.get('text'):
318+
footer_parts.append(flair_data['text'])
313319

314320
try:
315321
redditor = self.fetch_user(name=submission.author)
@@ -329,7 +335,7 @@ def discord(self, submission: models.Submission, submission_data: dict) -> dict:
329335
color=color,
330336
description=submission.selftext,
331337
footer=discord.EmbedFooter(
332-
text=f'Posted on r/{self.subreddit_name}',
338+
text=' - '.join(footer_parts),
333339
icon_url='https://www.redditstatic.com/desktop2x/img/favicon/favicon-32x32.png'
334340
),
335341
title=submission.title,
@@ -352,9 +358,31 @@ def discord(self, submission: models.Submission, submission_data: dict) -> dict:
352358

353359
return submission_data
354360

361+
@staticmethod
362+
def parse_flair_color(flair_color: Optional[str]) -> int:
363+
if not flair_color:
364+
return common.colors['white']
365+
366+
try:
367+
return int(flair_color.removeprefix('#'), 16)
368+
except ValueError:
369+
return common.colors['white']
370+
355371
def flair(self, submission: models.Submission, submission_data: dict) -> dict:
356-
# TODO: implement automatic flair checks or updates from submission metadata.
357-
logger.debug("Reddit flair handling is not implemented for submission=%r", submission)
372+
flair_template_id = getattr(submission, 'link_flair_template_id', None)
373+
flair_text = getattr(submission, 'link_flair_text', None)
374+
flair_background_color = getattr(submission, 'link_flair_background_color', None)
375+
376+
submission_data['link_flair_template_id'] = flair_template_id
377+
submission_data['link_flair_text'] = flair_text
378+
submission_data['link_flair_background_color'] = flair_background_color
379+
submission_data['flair'] = {
380+
'template_id': flair_template_id,
381+
'text': flair_text,
382+
'background_color': flair_background_color,
383+
'color': self.parse_flair_color(flair_background_color),
384+
}
385+
358386
return submission_data
359387

360388
def karma(self, submission: models.Submission, submission_data: dict) -> dict:

tests/unit/reddit/test_reddit_bot.py

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import pytest
2020

2121
# local imports
22+
from src.common import globals
2223
from src.reddit_bot.bot import Bot
2324

2425
Betamax.register_serializer(PrettyJSONSerializer)
@@ -238,14 +239,75 @@ def test_stream_loop_stops_before_streaming():
238239
assert processed == []
239240

240241

241-
@pytest.mark.parametrize("method_name", ["flair", "karma"])
242-
def test_submission_placeholder_handlers_log_unimplemented(caplog, method_name):
242+
def test_flair_normalizes_submission_flair():
243+
bot = bare_bot()
244+
submission = SimpleNamespace(
245+
id='abc123',
246+
link_flair_template_id='be393440-ff87-11ec-9bbd-e2c872b60c34',
247+
link_flair_text='Support',
248+
link_flair_background_color='#ea0027',
249+
)
250+
submission_data = {}
251+
252+
result = bot.flair(submission=submission, submission_data=submission_data)
253+
254+
assert result is submission_data
255+
assert result['link_flair_template_id'] == 'be393440-ff87-11ec-9bbd-e2c872b60c34'
256+
assert result['link_flair_text'] == 'Support'
257+
assert result['link_flair_background_color'] == '#ea0027'
258+
assert result['flair'] == {
259+
'template_id': 'be393440-ff87-11ec-9bbd-e2c872b60c34',
260+
'text': 'Support',
261+
'background_color': '#ea0027',
262+
'color': 0xea0027,
263+
}
264+
265+
266+
def test_discord_uses_normalized_flair(mocker):
267+
bot = bare_bot()
268+
bot.subreddit_name = 'LizardByte'
269+
bot.fetch_user = mocker.Mock(return_value=SimpleNamespace(
270+
name='test_user',
271+
icon_img='https://example.com/avatar.png',
272+
))
273+
send_message = mocker.Mock(return_value=object())
274+
mocker.patch.object(globals, 'DISCORD_BOT', SimpleNamespace(send_message=send_message))
275+
submission = SimpleNamespace(
276+
author='test_user',
277+
created_utc=1700000000,
278+
permalink='/r/LizardByte/comments/abc123/test/',
279+
selftext='Post body',
280+
title='Post title',
281+
)
282+
submission_data = {
283+
'flair': {
284+
'template_id': 'be393440-ff87-11ec-9bbd-e2c872b60c34',
285+
'text': 'Support',
286+
'background_color': '#ea0027',
287+
'color': 0xea0027,
288+
},
289+
'link_flair_background_color': '#ea0027',
290+
}
291+
292+
with patch.dict(os.environ, {'DISCORD_REDDIT_CHANNEL_ID': '12345'}):
293+
result = bot.discord(submission=submission, submission_data=submission_data)
294+
295+
send_message.assert_called_once()
296+
embed = send_message.call_args.kwargs['embed']
297+
assert send_message.call_args.kwargs['channel_id'] == '12345'
298+
assert embed.color.value == 0xea0027
299+
assert embed.footer.text == 'Posted on r/LizardByte - Support'
300+
assert result['bot_discord']['sent'] is True
301+
assert 'sent_utc' in result['bot_discord']
302+
303+
304+
def test_karma_placeholder_handler_logs_unimplemented(caplog):
243305
bot = bare_bot()
244306
submission = SimpleNamespace(id='abc123')
245307
submission_data = {}
246308

247309
with caplog.at_level(logging.DEBUG, logger='src.reddit_bot.bot'):
248-
result = getattr(bot, method_name)(submission=submission, submission_data=submission_data)
310+
result = bot.karma(submission=submission, submission_data=submission_data)
249311

250312
assert result is submission_data
251313
assert "not implemented" in caplog.text

0 commit comments

Comments
 (0)