diff --git a/example_config.yaml b/example_config.yaml index a2aaf63..94846b6 100644 --- a/example_config.yaml +++ b/example_config.yaml @@ -20,6 +20,7 @@ config: allow_spoilers: true show_nsfw_warning: true show_spoilers_warning: true + timeout: 60 -1001284025455: subreddits: - HentaiMemes @@ -29,6 +30,7 @@ config: allow_spoilers: true show_nsfw_warning: false show_spoilers_warning: true + timeout: 60 memes10k: subreddits: - linuxmemes @@ -41,6 +43,7 @@ config: allow_spoilers: true show_nsfw_warning: true show_spoilers_warning: true + timeout: 60 bot_admins: - thekneesocks - 214416808 diff --git a/redditbot.py b/redditbot.py index eb040ee..ea59a1f 100644 --- a/redditbot.py +++ b/redditbot.py @@ -44,7 +44,7 @@ if isinstance(_send_to_chats, list): j = {'subreddits': j, 'cron_duration': config_data['config']['cron_duration'], 'allow_selfposts': True, 'allow_nsfw': True, 'allow_spoilers': True, 'show_nsfw_warning': True, - 'show_spoilers_warning': True} + 'show_spoilers_warning': True, 'timeout': None} send_to_chats[i] = j bot_admins = config_data['config']['bot_admins'] @@ -93,55 +93,26 @@ async def main(): allow_spoilers = chat_data['allow_spoilers'] show_nsfw_warning = chat_data['show_nsfw_warning'] show_spoilers_warning = chat_data['show_spoilers_warning'] + timeout = chat_data.get('timeout') - @aiocron.crontab(cron_duration) - async def start_post(): + def _get_submission_blocc(): while True: - random.shuffle(subreddits) - def _get_submission_blocc(): - while True: - subreddit = reddit.subreddit(random.choice(subreddits)) - random_post = subreddit.random() - cpid = cpp = None - if random_post is None: - for submission in subreddit.hot(): - cpid = getattr(submission, 'crosspost_parent', None) - if cpid and getattr(random_post, 'crosspost_parent_list', None): - cpid = cpid[3:] - if submission.id in chat_sp + global_sp or cpid in chat_sp + global_sp: - continue - if not (allow_selfposts and allow_nsfw and allow_spoilers): - is_self = submission.is_self - nsfw = submission.over_18 - spoilers = submission.spoiler - if cpid: - cpp = reddit.submission(cpid) - if not allow_selfposts: - is_self = cpp.is_self - if not (nsfw and allow_nsfw): - nsfw = cpp.over_18 - if not (spoilers and allow_spoilers): - nsfw = cpp.spoiler - if is_self and not allow_selfposts: - continue - if nsfw and not allow_nsfw: - continue - if spoilers and not allow_spoilers: - continue - random_post = submission - break - cpid = getattr(random_post, 'crosspost_parent', None) + subreddit = reddit.subreddit(random.choice(subreddits)) + random_post = subreddit.random() + cpid = cpp = None + if random_post is None: + for submission in subreddit.hot(): + cpid = getattr(submission, 'crosspost_parent', None) if cpid and getattr(random_post, 'crosspost_parent_list', None): cpid = cpid[3:] - if random_post.id in chat_sp + global_sp or cpid in chat_sp + global_sp: + if submission.id in chat_sp + global_sp or cpid in chat_sp + global_sp: continue if not (allow_selfposts and allow_nsfw and allow_spoilers): - is_self = random_post.is_self - nsfw = random_post.over_18 - spoilers = random_post.spoiler - if cpid and not cpp: - cpp = reddit.submission(cpid) + is_self = submission.is_self + nsfw = submission.over_18 + spoilers = submission.spoiler if cpid: + cpp = reddit.submission(cpid) if not allow_selfposts: is_self = cpp.is_self if not (nsfw and allow_nsfw): @@ -154,18 +125,59 @@ async def main(): continue if spoilers and not allow_spoilers: continue - chat_sp.append(cpid or random_post.id) - print(random_post.id, random_post.shortlink) - return random_post, cpp - random_post, cpp = await client.loop.run_in_executor(None, _get_submission_blocc) + random_post = submission + break + cpid = getattr(random_post, 'crosspost_parent', None) + if cpid and getattr(random_post, 'crosspost_parent_list', None): + cpid = cpid[3:] + if random_post.id in chat_sp + global_sp or cpid in chat_sp + global_sp: + continue + if not (allow_selfposts and allow_nsfw and allow_spoilers): + is_self = random_post.is_self + nsfw = random_post.over_18 + spoilers = random_post.spoiler + if cpid and not cpp: + cpp = reddit.submission(cpid) + if cpid: + if not allow_selfposts: + is_self = cpp.is_self + if not (nsfw and allow_nsfw): + nsfw = cpp.over_18 + if not (spoilers and allow_spoilers): + nsfw = cpp.spoiler + if is_self and not allow_selfposts: + continue + if nsfw and not allow_nsfw: + continue + if spoilers and not allow_spoilers: + continue + chat_sp.append(cpid or random_post.id) + print(random_post.id, random_post.shortlink) + return random_post, cpp + + @aiocron.crontab(cron_duration) + async def start_post(): + while True: try: - await _actual_start_post(random_post, [chat], cpp, show_nsfw_warning, show_spoilers_warning) - except Exception: - logging.exception(random_post.id) + random_post, cpp = await asyncio.wait_for(client.loop.run_in_executor(None, _get_submission_blocc), timeout) + except asyncio.TimeoutError: + logging.error('%s timed out', chat) for i in bot_admins: - await client.send_message(i, f'{random_post.id}\n{traceback.format_exc()}', parse_mode=None) - else: + await client.send_message(i, f'{chat} timed out') break + except Exception: + logging.exception(chat) + for i in bot_admins: + await client.send_message(i, f'{chat}\n{traceback.format_exc()}') + else: + try: + await _actual_start_post(random_post, [chat], cpp, show_nsfw_warning, show_spoilers_warning) + except Exception: + logging.exception(random_post.id) + for i in bot_admins: + await client.send_message(i, f'{random_post.id}\n{traceback.format_exc()}', parse_mode=None) + else: + break await write_seen_posts() _added_chats.append(start_post) @@ -189,7 +201,7 @@ async def main(): async def _download_file(filename, url): print(url) - async with session.get(url, timeout=None) as resp: + async with session.get(url) as resp: with open(filename, 'wb') as file: while True: chunk = await resp.content.read(10)