Ejemplo n.º 1
0
class remove_card:
    async def command(client, message, content):
        card = get_card(content)
        
        if card is None:
            await client.message_create(message.channel, embed=Embed(None, '*Nothing found.*', CHESUTO_COLOR))
            return
        
        message = await client.message_create(message.channel, embed = Embed(
            None, f'Are you sure, to remove {card.name!r}?', CHESUTO_COLOR,))
        
        for emoji in REMOVE_CARD_EMOJIS:
            await client.reaction_add(message,emoji)
        
        try:
            event = await wait_for_reaction(client, message, ADD_IMAGE_CHECKER, 40.)
        except TimeoutError:
            emoji = REMOVE_CARD_CANCEL
        else:
            emoji = event.emoji
        
        await client.message_delete(message)
        
        if emoji is REMOVE_CARD_CANCEL:
            content = 'Cancelled.'
        else:
            card._delete()
            await Card.dump_cards(KOKORO)
            content = f'{card.name!r} successfully removed.'
        
        message = await client.message_create(message.channel,
            embed = Embed(description=content, color=CHESUTO_COLOR))
        
        await sleep(30., KOKORO)
        await client.message_delete(message)
        return
    
    checks = checks.has_role(CARDS_ROLE)
    
    async def description(command_context):
        return Embed('remove-card',(
            'Removes the specific card\n'
            f'Usage: `{command_context.prefix}remove-card <name>`\n'
            ), color=COLOR__FLAN_HELP).add_footer(
                f'You must have `{CARDS_ROLE}` role to use this command.')
Ejemplo n.º 2
0
class dump_all_card:
    async def command(client, message):
        channel = message.channel
        clients = channel.clients
        if len(clients) < 2:
            await client.message_create(channel.channel,
                'I need at least 2 clients at the channel to execute this command.')
            return
        
        for other_client in clients:
            if client is other_client:
                continue
            
            if channel.cached_permissions_for(other_client).can_send_messages:
                break
        else:
            await client.message_create(channel.channel,
                'I need at least 2 clients at the channel, which can sen messages as well!')
            return
        
        clients = (client,other_client)
        for client in clients:
            if channel.cached_permissions_for(client).can_manage_messages:
                await client.message_delete(message)
                break
        
        cards = list(CARDS_BY_NAME.values())
        cards.sort(key=lambda card:card.name)
        
        for card, client in zip(cards,cycle(clients),):
            embed = card.render_to_embed()
            
            await client.message_create(channel, embed=embed)
    
    checks = checks.has_role(CARDS_ROLE)
    
    async def description(command_context):
        return Embed('dump-all-card',(
            'Lists all the cards to this channel.\n'
            f'Usage: `{command_context.prefix}dump-all-card`\n'
            ), color=COLOR__FLAN_HELP).add_footer(
                f'You must have `{CARDS_ROLE}` role to use this command.')
Ejemplo n.º 3
0
        names = await get_random_names(count)

        for channel, name in zip(channels, names):
            await COMMAND_CLIENT.channel_edit(channel, name=name)


def cycle_rename():
    NAME_CYCLER_HANDLER.value = KOKORO.call_later(DAY, cycle_rename)
    Task(do_rename(), KOKORO)


NAME_CYCLER_HANDLER = Cell()

COMMAND_CLIENT: Client
COMMAND_CLIENT.command_processor.create_category(
    'CHANNEL NAMES', checks=[checks.has_role(ROLE__NEKO_DUNGEON__MODERATOR)])


def setup(lib):
    NAME_CYCLER_HANDLER.value = KOKORO.call_later(
        datetime.utcnow().replace(microsecond=0, second=0, minute=0,
                                  hour=0).timestamp() - time_now() + DAY,
        cycle_rename)


def teardown(lib):
    value = NAME_CYCLER_HANDLER.value
    if (value is not None):
        NAME_CYCLER_HANDLER.value = None
        value.cancel()
Ejemplo n.º 4
0
class checklist:

    async def command(client, message, content):
        result = []
        if content:
            rarity = Rarity.BY_NAME.get(content.lower(), None)
            if rarity is None:
                if len(content) > 50:
                    content = content[:50]+'...'
                result.append(Embed(f'{content!r} is not a rarity', color=CHESUTO_COLOR))
                
            else:
                filtered=[]
                
                for card in CARDS_BY_NAME.values():
                    if card.rarity is rarity:
                        if card.image_name is None:
                            continue
                        
                        filtered.append(card)
                        continue
                
                title = f'Checklist for {rarity.name}'
                
                limit=len(filtered)
                if limit:
                    parts=[]
                    index=1
                    
                    card=filtered[0]
                    name=card.name
                    length=len(name)
                    if length>EMBED_NAME_LENGTH:
                        name = name[:EMBED_NAME_LENGTH]+'...'
                        length = 203
                    
                    parts.append(name)
                    
                    while True:
                        if index==limit:
                            break
                        
                        card=filtered[index]
                        index=index+1
                        name=card.name
                        
                        name_ln=len(name)
                        if name_ln>EMBED_NAME_LENGTH:
                            name = name[:EMBED_NAME_LENGTH]+'...'
                            name_ln = 203
                        
                        length=length+name_ln+1
                        if length>2000:
                            result.append(Embed(title,''.join(parts), color=CHESUTO_COLOR))
                            length=name_ln
                            parts.clear()
                            parts.append(name)
                            continue
                        
                        parts.append('\n')
                        parts.append(name)
                        continue
                    
                    if parts:
                        result.append(Embed(title,''.join(parts), color=CHESUTO_COLOR))
                    
                    parts=None
                else:
                    result.append(Embed(title, color=CHESUTO_COLOR))
                
        else:
            filtered=tuple([] for x in range(len(Rarity.INSTANCES)))
            
            for card in CARDS_BY_NAME.values():
                if card.image_name is None:
                    continue
                
                filtered[card.rarity.index].append(card)
                continue
            
            title='Checklist'
            
            parts=[]
            length=0
            
            for rarity_index in range(len(filtered)):
                container=filtered[rarity_index]
                
                limit=len(container)
                if limit==0:
                    continue
                
                if length>1500:
                    result.append(Embed(title,''.join(parts), color=CHESUTO_COLOR))
                    length=0
                    parts.clear()
                else:
                    parts.append('\n\n')
                    length = length+2
                
                rarity_name=f'**{Rarity.INSTANCES[rarity_index].name}**\n\n'
                length = length+len(rarity_name)
                parts.append(rarity_name)
                
                card=container[0]
                name=card.name
                name_ln=len(name)
                if name_ln>EMBED_NAME_LENGTH:
                    name = name[:EMBED_NAME_LENGTH]+'...'
                    name_ln = 203
                
                length = length+name_ln
                parts.append(name)
                index=1
                
                while True:
                    if index==limit:
                        break
                    
                    card=container[index]
                    index=index+1
                    name=card.name
                    name_ln=len(name)
                    if name_ln>EMBED_NAME_LENGTH:
                        name = name[:EMBED_NAME_LENGTH]+'...'
                        name_ln=203
                    
                    length = length+1+name_ln
                    if length>2000:
                        result.append(Embed(title,''.join(parts), color=CHESUTO_COLOR))
                        length=len(rarity_name)+name_ln
                        parts.clear()
                        parts.append(rarity_name)
                        parts.append(name)
                        continue
                    
                    parts.append('\n')
                    parts.append(name)
                    continue
                
            if parts:
                result.append(Embed(title,''.join(parts), color=CHESUTO_COLOR))
            
            parts=None
        
        index=0
        limit=len(result)
        while True:
            if index==limit:
                break
            
            embed=result[index]
            index=index+1
            embed.add_footer(f'Page: {index}/{limit}')
        
        await Pagination(client,message.channel,result)
        return
    
    checks = checks.has_role(CARDS_ROLE)
    
    async def description(command_context):
        return Embed('checklist',(
            'Lists the cards of the given rarity, which have images added to them.\n'
            'If no rarity is provided, I will list all the cards with images.\n'
            f'Usage: `{command_context.prefix}checklist *rarity*`\n'
            ), color=COLOR__FLAN_HELP).add_footer(
                f'You must have `{CARDS_ROLE}` role to use this command.')
Ejemplo n.º 5
0
class add_image:
    async def command(client, message, cards_name):
        while True:
            attachments = message.attachments
            if attachments is None:
                content = 'The message has no attachment provided.'
                break
            
            if len(attachments) > 1:
                content = 'The message has more attachments.'
                break
            
            attachment = attachments[0]
            name=attachment.name
            extension=os.path.splitext(name)[1].lower()
            
            if extension not in ('.png','.jpg','.jpeg','.bmp','.mp4','.gif'): # are there more?
                content = 'You sure the message format is an image format?\n If you are please request adding it.'
                break
            
            if name in PROTECTED_FILE_NAMES:
                content = 'The file\'s name is same as a protected file\'s name.'
                break
            
            card = CARDS_BY_NAME.get(cards_name.lower(), None)
            if card is None:
                content = 'Could not find a card with that name.'
                break
            
            actual_image_name = card.image_name
            
            file_path = os.path.join(CHESUTO_FOLDER,name)
            exists = os.path.exists(file_path)
            
            should_dump = True
            if actual_image_name is None:
                if exists:
                    content = 'A file already exists with that name, if you overwrite it, more cards will have the same ' \
                              'image.\nAre you sure?'
                else:
                    content = None
            else:
                if exists:
                    if actual_image_name == name:
                        content = 'Are you sure at overwriting the card\'s image?'
                        should_dump = False
                    else:
                        content = 'A file with that name already exists.\nIf you overwrite this card\'s image like that, ' \
                                  'you will end up with more cards with the same image. Are you sure?'
                else:
                    content = 'The card has an image named differently. Are you sure like this?'
            
            if (content is not None):
                message = await client.message_create(message.channel,
                    embed = Embed(description=content, color=CHESUTO_COLOR))
                
                for emoji in ADD_IMAGE_EMOJIS:
                    await client.reaction_add(message,emoji)
                
                try:
                    event = await wait_for_reaction(client, message, ADD_IMAGE_CHECKER, 40.)
                except TimeoutError:
                    emoji = ADD_IMAGE_CANCEL
                else:
                    emoji = event.emoji
                
                await client.message_delete(message)
                
                if emoji is ADD_IMAGE_CANCEL:
                    content = 'Cancelled.'
                    break
            
            image_data = await client.download_attachment(attachment)
            with (await AsyncIO(file_path,'wb')) as file:
                await file.write(image_data)
            
            if should_dump:
                card.image_name = name
                await Card.dump_cards(KOKORO)
            
            content = f'Image successfully added for {card.name}.'
            break
        
        message = await client.message_create(message.channel,
            embed = Embed(description=content, color=CHESUTO_COLOR))
        
        await sleep(30.)
        await client.message_delete(message)
        return
    
    checks = checks.has_role(CARDS_ROLE)
    
    async def description(command_context):
        return Embed('add_image',(
            'Adds or updates an image of a card.\n'
            f'Usage: `{command_context.prefix}add_image <card name>`\n'
            'Also include an image as attachment.'
            ), color=COLOR__FLAN_HELP).add_footer(
                f'You must have `{CARDS_ROLE}` role to use this command.')
Ejemplo n.º 6
0
        return False
    
    if user.has_role(CARDS_ROLE):
        return True
    
    return False

async def set_bgm_name_description(command_context):
    return Embed('set-bgm-name', (
        'Changes a bgm\'s name\n'
        f'Usage: `{command_context.prefix}set-bgm-name <bgm name>`\n'
        'After it please define the new name and react with the OK emoji.'
        ), color=COLOR__FLAN_HELP).add_footer(
            f'You must have `{CARDS_ROLE}` role to use this command.')

@Flan.commands(checks=checks.has_role(CARDS_ROLE), category='VOICE', description=set_bgm_name_description)
async def set_bgm_name(client, message, content):
    bgm = get_bgm(content)
    
    if bgm is None:
        await client.message_create(message.channel, embed=Embed(None, '*Nothing found.*', CHESUTO_COLOR))
        return
    
    embed = Embed(f'Renaming: *{bgm.display_name}*', bgm.description, color=CHESUTO_COLOR) \
        .add_footer('Your next message will be captured as the new display name of the bgm.')
    
    message = await client.message_create(message.channel, embed=embed)
    
    try:
        response = await wait_for_message(client, message.channel, check_has_cards_role, 300.0)
    except TimeoutError: