Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- import time
- import discord
- import asyncio
- import random
- import threading
- import re as _re
- import common.credentials.discord as _discord
- from parser import parse_message
- def start_discord(logger, discord_queue, credentials):
- username = credentials['username']
- password = credentials['password']
- covername = credentials['covername']
- # set the thread name to the spy cover, for logging purposes
- thread = threading.current_thread()
- thread.setName(covername)
- wait = random.randint(1,90)
- msg = 'waiting {0} seconds before connecting'.format(wait)
- logger.info(msg)
- loop = asyncio.new_event_loop()
- asyncio.set_event_loop(loop)
- client = discord.Client(loop=loop, cache_auth=False)
- @client.event
- async def on_ready():
- msg = 'discord ready'
- logger.info(msg)
- loginmsg = '```diff' + '\n' + '+ {0} online```'.format(covername)
- client.change_presence(game=None, status='invisible', afk=False)
- discord_queue.put(loginmsg)
- @client.event
- async def on_server_remove():
- msg = 'discord disconnected'
- logger.error(msg)
- loginmsg = '```diff' + '\n' + '+ {0} offline [remove]```'.format(covername)
- discord_queue.put(loginmsg)
- @client.event
- async def on_server_unavailable():
- msg = 'discord user unavailable'
- logger.error(msg)
- loginmsg = '```diff' + '\n' + '+ {0} offline [unavailable]```'.format(covername)
- discord_queue.put(loginmsg)
- @client.event
- async def on_message(message):
- if message.mention_everyone:
- msg = 'discord ping'
- logger.info(msg)
- author_clean = message.author
- from_channel = message.channel
- detail = message.server
- message_parsed = parse_message(covername, message.content, from_channel, author_clean, detail)
- discord_queue.put(message_parsed)
- attempt = 1
- while attempt < 5:
- if attempt < 5:
- msg = "connection attempt {0} for {1}".format(attempt, covername)
- try:
- client.run(username, password)
- attempt = 6
- except Exception as error:
- msg = 'discord connection error on user {0}: {1}'.format(username, error)
- logger.critical(msg)
- loginmsg = '```diff' + '\n' + '- {0} offline [unable to connect]```'.format(covername)
- discord_queue.put(loginmsg)
- attempt += 1
- time.sleep(10)
- loop = asyncio.new_event_loop()
- asyncio.set_event_loop(loop)
- client = discord.Client(loop=loop, cache_auth=False)
- # clean up
- try:
- client.logout()
- except Exception as e:
- print('htf? '.format(e))
- # thanks https://stackoverflow.com/questions/37278647/fire-and-forget-python-async-await/37345564#37345564
- pending = asyncio.Task.all_tasks()
- for task in pending:
- task.cancel()
- # Now we should await task to execute it's cancellation.
- # Cancelled task raises asyncio.CancelledError that we can suppress:
- with suppress(asyncio.CancelledError):
- loop.run_until_complete(task)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement