def __init__(self, configs): # event bus and loop self.main_loop = asyncio.get_event_loop() self.bus = EventBus() # mongo db free4all connect('secret') self.mongo_db = Document._get_db() # discord self.discord_client = discord.Client() self.secret_server = discord.Server(id='326095959173890059') self.secret_channel = discord.Channel(id='404630967257530372', server=self.secret_server) self.welcome_channel = discord.Channel(id='404795628019777557', server=self.secret_server) # github self.git_client = Github(configs['github_username'], configs['github_password']) self.git_repo = self.git_client.get_repo('secRetDBot/secRet_dBot') self.web_repo = self.git_client.get_repo('secRetDBot/secRet-bot-frontend') # discord message handler self.message_handler = MessageHandler(self) # handlers self.handler_status = status.Status(self)
def onEnable(self): if not discord or not PY3: self.log.warning( "Discord Relay plugin requires Python 3 and the discord import." ) return False self.client = discord.Client() self.server = discord.Server(id="serverID") self.sendChannel = discord.Channel(name="channelName", server=self.server, id="channelID") self.api.registerEvent("player.message", self.player_message) self.api.registerEvent("player.login", self.login) self.discord_storage = self.api.getStorage("discord") self.player_data = self.discord_storage.Data self.api.registerCommand("disctoggle", self._toggle, None) self.api.registerHelp( "DiscordRelay", "sends and receives messages from Discord", [("/disctoggle", "toggles whether you want to communicate with the Discord server", None)]) @self.client.event async def on_message(message): for p in self.api.minecraft.getPlayers(): if self.player_data[p.uuid]: p.message(message) self.client.start("token")
def tmp_create_channel(): permissions_payload = [{ 'allow': rule.pair()[0].value, 'deny': rule.pair()[1].value, 'id': target.id, 'type': 'member' if isinstance(target, discord.User) else 'role' } for target, rule in perms] def tmp_post_request(): payload = { 'name': name, 'type': str(discord.ChannelType.voice), 'permission_overwrites': permissions_payload, 'parent_id': target_category } return self.http.request( Route('POST', '/guilds/{guild_id}/channels', guild_id=message.server.id), json=payload, # reason=None ) data = yield from tmp_post_request() channel = discord.Channel(server=message.server, **data) return channel
async def destroy(client, message, **kwargs): """Delete a tournament on Challonge and cleanup Discord bindings Use with caution! This action can't be reversed! No Arguments """ try: t = await kwargs.get('account').tournaments.show( kwargs.get('tournament_id')) await kwargs.get('account').tournaments.destroy( kwargs.get('tournament_id')) except ChallongeException as e: await client.send_message(message.author, T_OnChallongeException.format(e)) else: if kwargs.get( 'tournament_role' ): # tournament role may have been deleted by finalize before await client.delete_role(message.server, kwargs.get('tournament_role')) await client.delete_channel(message.channel) channelId = db.get_server(message.server).management_channel_id await client.send_message( discord.Channel(server=message.server, id=channelId), '✅ Tournament {0} has been destroyed by {1}!'.format( t['name'], message.author.mention)) db.remove_tournament(kwargs.get('tournament_id'))
async def create_channel(self, server, name, *overwrites, parent_id, user_limit: int = 0, channel_type=discord.ChannelType.text): """d.py 0.16 recipe for creating a channel including category support""" payload = { "name": name, "type": str(channel_type), "user_limit": user_limit } if parent_id is not None: payload["parent_id"] = parent_id if len(overwrites) > 0: perms = [] for overwrite in overwrites: target, perm = overwrite allow, deny = perm.pair() perms.append({ "allow": allow.value, "deny": deny.value, "id": target.id, "type": type(target).__name__.lower() }) payload["permission_overwrites"] = perms data = await self.bot.http.request(discord.http.Route( 'POST', '/guilds/{guild_id}/channels', guild_id=server.id), json=payload) return discord.Channel(server=server, **data)
def submission_puller(self, entry): yield from self.wait_until_ready() channel = discord.Channel( server=discord.Server(id='260325692040937472'), id=entry[0]) self.pool[entry[0]] = entry[1][:] b = True while not self.is_closed: if self.localtime.localize( datetime.today()).minute in [0, 15, 30, 45]: if b: b = False if len(self.pool[entry[0]]) == 0: self.pool[entry[0]] = entry[1][:] pop_index = random.randint(0, len(self.pool[entry[0]]) - 1) selection = self.pool[entry[0]].pop(pop_index) for submission in self.reddit.subreddit(selection).hot( limit=10): if not submission.is_self: yield from self.send_message( channel, submission.url) submission.hide() break else: if not b: b = True self.todayTZ = self.localtime.localize(datetime.today()) yield from asyncio.sleep(30)
async def on_member_join(member): server = member.server channel = discord.Channel(server=server, id="366215186866241538") fmt = "{0.mention}님 ``{1.name}``에 어서오세요.\n{0.mention}さん ``{1.name}``にようこそ" if server.id == '366215186866241536': await bot.send_message(channel, fmt.format(member, server)) else: pass
async def create_txt_channel(self, guild, name, parent_id): payload = {"name": name, "type": 0} if parent_id is not None: payload["parent_id"] = parent_id data = await self.bot.http.request(discord.http.Route( 'POST', '/guilds/{guild_id}/channels', guild_id=guild.id), json=payload) return discord.Channel(guild=guild, **data)
async def create_channel_category(name: str) -> discord.Channel: data = await client.http.request( discord.http.Route('POST', '/guilds/{guild_id}/channels', guild_id=server.id), json={ 'name': name, 'type': 4 # 4 is the "category" channel type }) channel = discord.Channel(server=server, **data) return channel
def on_member_join(self, member): non_default = self.json_data['Commands']['on_join']['User-Defined'] default = self.json_data['Commands']['on_join']['Default-Message'] server = discord.Server(id=member.server.id, name=member.server) server.name = member.server.name server.id = member.server.id container = discord.Message(author={ 'id': member.id, 'server': member.server.id }, reactions=[], content='') container.server = server container.author.name = member.name if non_default is not None: yield from self.send_message( discord.Channel(server=server, id='346821860589305858'), self.format_string(non_default, container)) else: yield from self.send_message( discord.Channel(server=server, id='346821860589305858'), self.format_string(default, container))
async def leaveserver(client, message, **kwargs): """Kick the Challonge bot out of your server Using this command, the bot will also remove the management channel it created """ channelId = db.get_server(message.server).management_channel_id await client.delete_channel(discord.Channel(server=message.server, id=channelId)) for r in message.server.me.roles: if r.name == C_RoleName: try: await client.delete_role(message.server, r) except discord.errors.HTTPException as e: await client.send_message(message.server.owner, T_RemoveChallongeRoleError.format(e)) break await client.leave_server(message.server)
async def _clone_channel( self, origin: discord.Channel, new_name: str, *overwrites): """ Channel categories don't exist in discord.py 0.16 This isn't an ideal way of doing this, but to support channel categories on 0.16, I don't have many other options for doing it. """ # The good news is this function doesn't need to be ported to # the rewrite version of the cog data = await self.bot.http.request( discord.http.Route( 'GET', '/guilds/{guild_id}/channels', guild_id=origin.server.id)) keys = [ 'type', 'bitrate', 'user_limit', 'permission_overwrites', 'parent_id', 'nsfw' ] channeldata = [d for d in data if d['id'] == origin.id][0] payload = {k: v for k, v in channeldata.items() if k in keys} if len(overwrites) > 0: for overwrite in overwrites: target, perm = overwrite allow, deny = perm.pair() o_data = { 'allow': allow.value, 'deny': deny.value, 'id': target.id, 'type': type(target).__name__.lower() } payload['permission_overwrites'] = [ o for o in payload['permission_overwrites'] if o['id'] != o_data['id'] ] payload['permission_overwrites'].append(o_data) payload['name'] = new_name new_channeldata = await \ self.bot.http.request( discord.http.Route( 'POST', '/guilds/{guild_id}/channels', guild_id=origin.server.id), json=payload) return discord.Channel(server=origin.server, **new_channeldata)
async def main_task(): global client startupdelta = time.time() - jose.start_time jcommon.logger.info("--- STARTUP TOOK %.2f SECONDS ---", startupdelta) if jose.off_mode: msgid = random.getrandbits(80) userid = str(random.getrandbits(80)) jcommon.ADMIN_IDS.append(userid) user_dis = str(random.randint(1111, 9999)) channelid = str(random.getrandbits(80)) serverid = str(random.getrandbits(80)) # create discord objects _server = discord.Server(name='Offline José Mode', id=serverid) userdict = {'name': 'Offline Admin', 'id': userid, \ 'discriminator': user_dis, 'avatar': None, 'bot': False, \ 'server': _server} _channel = discord.Channel(name='talking', server=_server, \ id=channelid, is_private=False, is_defualt=True) jcommon.logger.info("You are %s#%s", userdict['name'], \ userdict['discriminator']) # am I really doing this? overwrite_discord_client() while True: msg = input("José> ") message = discord.Message(content=msg, channel=_channel, \ author=userdict, id=str(msgid), reactions=[]) msgid += 1 await on_message(message) else: try: jcommon.logger.info("[start] discord client") await client.start(jconfig.discord_token) jcommon.logger.info("[exit] discord client") except discord.GatewayNotFound: jcommon.logger.error("Received GatewayNotFound from discord.") except Exception as err: jcommon.logger.error("Received %r from client.start", err, exc_info=True)
async def _clone_channel(self, origin, new_name): """I can support channel categories""" data = await self.bot.http.request( discord.http.Route( 'GET', '/guilds/{guild_id}/channels', guild_id=origin.server.id)) keys = ['type', 'bitrate', 'user_limit', 'permission_overwrites', 'parent_id', 'nsfw'] channeldata = [d for d in data if d['id'] == origin.id][0] payload = {k: v for k, v in channeldata.items() if k in keys} payload['name'] = new_name new_channeldata = await \ self.bot.http.request( discord.http.Route( 'POST', '/guilds/{guild_id}/channels', guild_id=origin.server.id), json=payload) return discord.Channel(server=origin.server, **new_channeldata)
def daily_puzzle(self): yield from self.wait_until_ready() channel = discord.Channel( server=discord.Server(id='260325692040937472'), id='314032599838359553') parser = html2text.HTML2Text() parser.ignore_links = True done = False while not self.is_closed: if self.localtime.localize(datetime.today()).hour == 10: if self.localtime.localize(datetime.today()).minute == 0: feed = feedparser.parse('https://thinkwitty.com/feed') index = 0 while not done and index < 5: if feed.entries[index]['tags'][1][ 'term'] == 'Puzzle of the day': done = True text = parser.handle( feed.entries[4]['content'][0]['value']) index = text.find('https://') end = index for x, val in enumerate(text[index:]): if val == '?': end += x break image_link = text[index:end].replace('\n', '') yield from self.send_message(channel, image_link) else: index += 1 else: if not done: done = False self.todayTZ = self.localtime.localize(datetime.today()) yield from asyncio.sleep(30)
from github import Github from message_handler import MessageHandler from secret import SecRet # read configs with open('configs.json', 'r') as f: configs = json.load(f) # event bus and loop main_loop = asyncio.get_event_loop() bus = EventBus() # discord client = discord.Client() secret_server = discord.Server(id='326095959173890059') secret_channel = discord.Channel(id='404630967257530372', server=secret_server) welcome_channel = discord.Channel(id='404795628019777557', server=secret_server) # github g = Github(configs['github_username'], configs['github_password']) repo = g.get_repo('iGio90/secRet_dBot') # message handler message_handler = MessageHandler(bus, client, secret_server, secret_channel, repo) # secret thread for additional periodic stuffs secret = SecRet(bus, repo) secret.setName('secRet') secret.start()
class Channels: news = discord.Channel(id='430365781721743362', server=Servers.FGL) lab = discord.Channel(id='380104197837815811', server=Servers.FGL) log = discord.Channel(id='474683293304881175', server=Servers.FGL) shower = discord.Channel(id='446333540381229066', server=Servers.FGL) dev = discord.Channel(id='475059718562250752', server=Servers.FGL)
from functions import commands from functions import configparser botfile = __file__ botpath = sys.path[0] #os.sep.join(__file__.split(os.sep)[:-1]) client = discord.Client() conf = configparser.config() bot = conf['botname'] account = conf['account'] password = conf['password'] server_name = conf['server']['name'] server_id = conf['server']['id'] home_name = conf['home_channel']['name'] home_id = conf['home_channel']['id'] server = discord.Server(name=server_name, id=server_id) home = discord.Channel(name=home_name, id=home_id, server=server) prev_resp = '' reload_msg = "reloading..." # extend conf dict with bot file context conf['botfile'] = botfile conf['botpath'] = botpath switch = { '!apache': commands.apache, '!reload': commands.reload, '!diag': commands.diag, '!username': commands.username, '!roles': commands.roles, '!channel': commands.channel, '!server': commands.server,
async def consoleIO(): client = kurisu.prefs.discordClient channels = ['', '', '', '', '', '', '', '', '', '', ''] channelID = await ainput('Channel ID: ') test = False if channelID == '': print('Режим только тестового канала активирован') test = True else: channels[0] = discord.Channel( id=channelID, server=discord.Server(id='380104197267521537')) channels[10] = discord.Channel( id='446333540381229066', server=discord.Server(id='380104197267521537')) while True: stdin = await ainput('>> ') if stdin[0] == '/': if stdin[1] == '!': preset = [ '446333540381229066', '380104197837815811', '430365781721743362', '380110041526829076' ] i = 0 for c in preset: channels[i] = client.get_channel(c) i += 1 test = False print('Пресет "Steins;Gate" установлен') if stdin[1] == 'g': await client.change_presence( game=discord.Game(name=stdin[3:], type=3)) print('Game Presence изменен на %s' % stdin[3:]) if stdin[1] == 'c': attr = stdin[3:].split() if len(attr) == 1: attr = [attr[0], '0'] attr[1] = int(attr[1]) channels[attr[1]] = client.get_channel(attr[0]) if channels[attr[1]] is None: print('Канал с ID %s не найден' % attr[0]) else: print('Канал %s изменен на #%s (%s)' % (attr[1], channels[attr[1]].name, attr[0])) if test: test = False print('Режим только тестового канала деактивирован') if stdin[1] == 't': await client.send_message(channels[10], stdin[3:]) if stdin[1] == 'a': for i in range(10): channels[i] = '' test = True print('Режим только тестового канала активирован') if stdin[1] == 'l': for i in range(10): print('%s | #%s' % (i, channels[i] == '' and '---' or channels[i].name)) continue if test: await client.send_message(channels[10], stdin) else: if stdin[0].isdigit(): channel = channels[int(stdin[0])] text = stdin[2:] else: channel = channels[0] text = stdin await client.send_message(channel, text)
def __init__(self, shell=False): if not shell: discord.Client.__init__(self) # Timezone self.timezone = Zone.Zone(10, False, 'AEST') self.localtime = pytz.timezone('Australia/Sydney') self.five_alert = False self.one_alert = False self.alert_times = [[1, 3, 5, 7, 9, 19, 21, 23], [0, 2, 4, 6, 8, 18, 20, 22]] self.alert_clear = [] self.todayTZ = self.localtime.localize(datetime.today()) self.kritiasChannel = discord.Channel( id='386135531483955220', server=discord.Server(id='260325692040937472')) self.kritiasWatch = discord.Role( id='386135324918808576', server=discord.Server(id='260325692040937472')) # Logger self.logger = None # JSON Properties self.json_data = None self.get_json_properties() self.commands = [] self.sub_commands = [] self.command_level = {} self.load_commands() for x in self.json_data['Commands'].keys(): self.sub_command_crawler(x) # Spreadsheet Accessor self.spreadsheet_accessor = SpreadsheetAccessor.SpreadsheetAccessor( self.logger) self.locals = {} # Reddit API redditAPI = None self.subreddits = [] self.load_subreddit_pages() self.pool = {} self.reddit = praw.Reddit( client_id=os.environ['rapi_client_id'], client_secret=os.environ['rapi_client_secret'], username=os.environ['rapi_username'], password=os.environ['rapi_password'], user_agent=os.environ['rapi_user_agent']) # Commands and command handlers self.command_queue = Queue() for x in range(4): t = threading.Thread(target=self.message_worker) t.daemon = True t.start() self.local_data_queue = Queue() # Local data creator handlers for x in range(4): t = threading.Thread(target=self.local_worker) t.daemon = True t.start() self.prefix = self.json_data['Prefix'] self.load_to_local() self.loop.create_task(self.kritias_alert()) self.loop.create_task(self.spreadsheet_connection_refresher()) #self.loop.create_task(self.daily_puzzle()) for x, entry in enumerate(self.subreddits): self.loop.create_task(self.submission_puller(entry))