예제 #1
0
파일: race.py 프로젝트: incnone/necrobot
    def record(self):
        self._status = RaceStatus['finalized'] if self.num_finished else RaceStatus['cancelled']

        if self._recorded:
            return
        self._recorded = True

        time_str = ''
        if self._start_datetime:
            time_str = self._start_datetime.strftime("%d %B %Y, UTC %H:%M")

        #TODO: be better (since results posted should adapt for best-of-3, repeat-3, etc; this shouldn't be called here
        yield from self.room.post_result('Race begun at {0}:\n```\n{1}{2}\n```'.format(time_str, self.leaderboard_header, self.leaderboard_text))

        necrodb = NecroDB()
        necrodb.record_race(self)
예제 #2
0
 def __init__(self, client, logger):
     self.client = client
     self.server = None
     self.prefs = None
     self.modules = []
     self.admin_id = None
     self.necrodb = NecroDB()
     self.logger = logger
     self._main_channel = None
     self._wants_to_quit = False
     self._admin_module = None
예제 #3
0
class Necrobot(object):

    ## Barebones constructor
    def __init__(self, client, logger):
        self.client = client
        self.server = None
        self.prefs = None
        self.modules = []
        self.admin_id = None
        self.necrodb = NecroDB()
        self.logger = logger
        self._main_channel = None
        self._wants_to_quit = False
        self._admin_module = None

    ## Initializes object; call after client has been logged in to discord
    def post_login_init(self, server_id, admin_id=0):
        self.admin_id = admin_id if admin_id else None

        #set up server
        id_is_int = False
        try:
            server_id_int = int(server_id)
            id_is_int = True
        except ValueError:
            id_is_int = False

        if self.client.servers:
            for s in self.client.servers:
                if id_is_int and s.id == server_id:
                    print("Server id: {}".format(s.id))
                    self.server = s
                elif s.name == server_id:
                    print("Server id: {}".format(s.id))
                    self.server = s
        else:
            print('Error: Could not find the server.')
            exit(1)

        self._main_channel = self.find_channel(config.MAIN_CHANNEL_NAME)
        self.load_module(AdminModule(self))
        self.prefs = PrefsModule(self, self.necrodb)
        self.load_module(self.prefs)

    # Causes the Necrobot to use the given module
    # Doesn't check for duplicates
    def load_module(self, module):
        self.modules.append(module)

    # True if the bot wants to quit (and not re-login)
    @property
    def quitting(self):
        return self._wants_to_quit

    # Return the #necrobot_main channel
    @property
    def main_channel(self):
        return self._main_channel

    # Return the #command_list channel
    @property
    def ref_channel(self):
        for channel in self.server.channels:
            if channel.name == config.REFERENCE_CHANNEL_NAME:
                return channel
        return None

    ## Get a list of all admin roles on the server
    @property
    def admin_roles(self):
        admin_roles = []
        for rolename in config.ADMIN_ROLE_NAMES:
            for role in self.server.roles:
                if role.name == rolename:
                    admin_roles.append(role)
        return admin_roles

    # Returns true if the user is a server admin
    def is_admin(self, user):
        member = self.get_as_member(user)
        admin_roles = self.admin_roles
        for role in member.roles:
            if role in admin_roles:
                return True
        return False

    # Returns the channel with the given name on the server, if any
    def find_channel(self, channel_name):
        for channel in self.server.channels:
            if channel.name == channel_name:
                return channel
        return None

    ## Returns a list of all members with a given username (capitalization ignored)
    def find_members(self, username):
        to_return = []
        for member in self.server.members:
            if member.name == username:
                to_return.append(member)
        return to_return

    ## Log out of discord
    @asyncio.coroutine
    def logout(self):
        self._wants_to_quit = True
        yield from self.client.logout()

    ## Reboot our login to discord (log out, but do not set quitting = true)
    @asyncio.coroutine
    def reboot(self):
        self._wants_to_quit = False
        yield from self.client.logout()

    @asyncio.coroutine
    def on_member_join(self, member):
        self.register_user(member)

    def register_all_users(self):
        self.necrodb.register_all_users(self.server.members)

    def register_user(self, member):
        self.necrodb.register_all_users([member])

    @asyncio.coroutine
    def execute(self, cmd):
        # don't care about bad commands
        if cmd.command == None:
            return

        # don't reply to self
        if cmd.author == self.client.user:
            return

        # only reply on-server or to PM
        if not cmd.is_private and cmd.server != self.server:
            return

        # let each module attempt to handle the command in turn
        for module in self.modules:
            asyncio.ensure_future(module.execute(cmd))

    # Returns the given Discord User as a Member of the server
    def get_as_member(self, user):
        for member in self.server.members:
            if member.id == user.id:
                return member