예제 #1
0
    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)
예제 #2
0
    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")
예제 #3
0
                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
예제 #4
0
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'))
예제 #5
0
    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)
예제 #6
0
    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)
예제 #7
0
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
예제 #8
0
    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)
예제 #9
0
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
예제 #10
0
 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))
예제 #11
0
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)
예제 #12
0
    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)
예제 #13
0
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)
예제 #14
0
 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)
예제 #15
0
    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)
예제 #16
0
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()
예제 #17
0
파일: __init__.py 프로젝트: atik1n/kurisu
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)
예제 #18
0
파일: cody.py 프로젝트: beardfist/Cody
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,
예제 #19
0
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)
예제 #20
0
    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))