Ejemplo n.º 1
0
async def on_message(message):
    lmsg = None
    smsg = None
    if not message.author.bot:
        if message.content.startswith('cb.'):
            fields = message.content.split()
            cmd = fields[0].split('.')[1]
            await bot.call(cmd, message)
            return
    async with lock:
        if not message.author.bot:
            server, created = Server.get_or_create(sid=message.server.id)
            user, created = User.get_or_create(uid=message.author.id)
            local, created = LocalLevel.get_or_create(user=user, server=server)

            level, exp = await levelup(server.level, server.experience)
            try:
                if level > server.level:
                    # Yay, the server leveled up
                    if server.announce_channel:
                        channel = client.get_channel(
                            f'{server.announce_channel}')
                        smsg = await client.send_message(
                            channel,
                            f"{party} {message.server.name} is now level"
                            f" {level}! {party}")
            except Exception as e:
                pass

            server.level = level
            server.experience = exp
            server.save()

            level, exp = await levelup(user.level, user.experience)

            user.level = level
            user.experience = exp
            user.save()

            level, exp = await levelup(local.level, local.experience)
            try:
                if level > local.level:
                    # User leveled up on the server
                    leaders = LocalLevel.select().where(
                        LocalLevel.server == server).order_by(
                            LocalLevel.level.desc(),
                            LocalLevel.experience.desc()).limit(1)

                    if f"{leaders[0].user.uid}" == message.author.id:
                        leaderboard_roles = Role.select().where(
                            (Role.server == server)
                            & (Role.leaderboard == True)).order_by(
                                Role.awardlevel.desc())

                        leader_role = discord.utils.get(
                            message.server.roles,
                            id=f'{leaderboard_roles[0].rid}')
                        for member in message.server.members:
                            item = next((i for i in member.roles
                                         if i.id == f"{leader_role.id}"), None)
                            if item:
                                await client.remove_roles(member, leader_role)
                        await client.add_roles(message.author, leader_role)
                    try:
                        try:
                            role = Role.get((Role.server == server)
                                            & (Role.awardlevel == level))
                        except Role.DoesNotExist as e:
                            role = None
                        if role:
                            r = discord.utils.get(message.server.roles,
                                                  id=f'{role.rid}')
                            try:
                                logger.info(f"Adding role {r.name} to "
                                            f"{message.author.name}")
                                await client.add_roles(message.author, r)
                            except AttributeError as e:
                                logger.exception("Could not add role")
                    except Role.DoesNotExist as e:
                        logger.exception("Count not find level up reward")
            except Exception as e:
                logger.exception("Could not process level up")

            local.level = level
            local.experience = exp
            local.save()

    await asyncio.sleep(10)
    if lmsg:
        await client.delete_message(lmsg)
    if smsg:
        await client.delete_message(smsg)