Beispiel #1
0
async def process_message_args(server_name, parsed_args, message):
    if parsed_args.help:
        asyncio.create_task(discord_service.get_service_manager().send_message(
            discord_service.Response(server_name, format_help())))
    if parsed_args.secret:
        asyncio.create_task(discord_service.get_service_manager().send_message(
            discord_service.Response(
                server_name, 'Thank you, cnofafva, for giving me life!')))
    if parsed_args.about:
        asyncio.create_task(discord_service.get_service_manager().send_message(
            discord_service.Response(server_name, (
                'This bot is open source and can be built for any DayZ server\n'
                'For more information, visit https://github.com/schana/carim-discord-bot'
            ))))
    await process_admin_args(server_name, parsed_args, message)
Beispiel #2
0
    async def on_message(self, message: discord.Message):
        if message.author == self.user:
            return

        for server_name in config.get_server_names():
            if config.get_server(server_name).rcon_password is not None:
                if message.channel.id == config.get_server(
                        server_name).chat_channel_id:
                    await arguments.process_chat(server_name, message)
                elif message.channel.id == config.get_server(server_name).admin_channel_id \
                        and message.content.startswith('--'):
                    args = shlex.split(message.content, comments=True)
                    try:
                        parsed_args, remaining_args = arguments.message_parser.parse_known_args(
                            args)
                    except (ValueError, argparse.ArgumentError):
                        log.info(f'invalid command {message.content}')
                        return
                    if remaining_args == args:
                        log.info(f'invalid command {message.content}')
                        asyncio.create_task(
                            discord_service.get_service_manager().send_message(
                                discord_service.Response(
                                    server_name,
                                    f'invalid command\n`{message.content}`')))
                    else:
                        await arguments.process_message_args(
                            server_name, parsed_args, message)

        if message.channel.id in config.get(
        ).user_channel_ids and message.content.startswith('--'):
            args = shlex.split(message.content, comments=True)
            try:
                parsed_args, remaining_args = arguments.user_message_parser.parse_known_args(
                    args)
                if remaining_args == args:
                    return
            except (ValueError, argparse.ArgumentError):
                log.info(f'invalid command {message.content}')
                asyncio.create_task(
                    discord_service.get_service_manager().send_message(
                        discord_service.UserResponse(
                            message.channel.id,
                            f'invalid command\n`{message.content}`')))
                return
            await arguments.process_user_message_args(message.channel.id,
                                                      parsed_args)

        for custom_command in config.get().custom_commands:
            custom_command: message_builder.Response = custom_command
            if custom_command.enabled:
                if message.channel.id in custom_command.channels or len(
                        custom_command.channels) == 0:
                    if re.match(custom_command.command, message.content):
                        embed = custom_command.generate()
                        if len(embed) <= 6000:
                            await message.channel.send(embed=embed)
                        else:
                            await message.channel.send(
                                f'Message longer than 6000 character limit: {len(embed)}'
                            )
Beispiel #3
0
async def process_admin_args(server_name, parsed_args, message):
    if parsed_args.list_priority:
        cf_message = omega_service.QueuePriorityList(server_name)
        await omega_service.get_service_manager().send_message(cf_message)
        try:
            result = await cf_message.result
            result = json.dumps(result, indent=1)
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(
                        server_name, f'**Queue Priority**\n```{result}```')))
        except asyncio.CancelledError:
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(
                        server_name, f'**Queue Priority**\nquery timed out')))
    if 'create_priority' in parsed_args:
        cftools_id, comment, days = parsed_args.create_priority
        try:
            days = int(days)
            if days != -1:
                expires_at = datetime.datetime.now(
                    tz=datetime.timezone.utc) + datetime.timedelta(days=days)
                expires_at = expires_at.timestamp()
            else:
                expires_at = -1
        except ValueError:
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(server_name,
                                             f'Invalid days: {days}')))
            return
        cf_message = omega_service.QueuePriorityCreate(server_name, cftools_id,
                                                       comment, expires_at)
        await omega_service.get_service_manager().send_message(cf_message)
        try:
            result = await cf_message.result
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(
                        server_name, f'**Create Priority**\n{result}')))
        except asyncio.CancelledError:
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(
                        server_name, f'**Create Priority**\nquery timed out')))
    if 'revoke_priority' in parsed_args:
        cftools_id = parsed_args.revoke_priority
        cf_message = omega_service.QueuePriorityRevoke(server_name, cftools_id)
        await omega_service.get_service_manager().send_message(cf_message)
        try:
            result = await cf_message.result
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(
                        server_name, f'**Revoke Priority**\n{result}')))
        except asyncio.CancelledError:
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(
                        server_name, f'**Revoke Priority**\nquery timed out')))
    if 'command' in parsed_args:
        if parsed_args.command is None:
            command = 'commands'
        else:
            command = parsed_args.command
        service_message = rcon_service.Command(server_name, command)
        await rcon_service.get_service_manager(server_name).send_message(
            service_message)
        try:
            result = await service_message.result
            asyncio.create_task(discord_service.get_service_manager(
            ).send_message(
                discord_service.Response(
                    server_name,
                    f'**{command}**\n{str(result) if result else "success"}')))
        except asyncio.CancelledError:
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(
                        server_name, f'**{command}**\nquery timed out')))
    if 'shutdown' in parsed_args:
        if parsed_args.shutdown is not None:
            delay = parsed_args.shutdown
        else:
            delay = 0
        service_message = rcon_service.SafeShutdown(server_name, delay)
        await rcon_service.get_service_manager(server_name).send_message(
            service_message)
    if parsed_args.status:
        commands_info = list()
        commands_config = config.get_server(server_name).scheduled_commands
        for i, command_config in enumerate(commands_config):
            sc = scheduled_command.get_service_manager(server_name, i)
            next_run = sc.command['next']
            if not isinstance(next_run, str):
                next_run = datetime.timedelta(seconds=next_run)
                next_run -= datetime.timedelta(
                    microseconds=next_run.microseconds)
                next_run = str(next_run)
            c_info = dict(index=i,
                          command=sc.command['command'],
                          interval=sc.command['interval'],
                          next_run=next_run)
            if sc.command.get('skip', False):
                c_info['skip_next'] = True
            commands_info.append(c_info)
        asyncio.create_task(discord_service.get_service_manager().send_message(
            discord_service.Response(
                server_name, f'```{json.dumps(commands_info, indent=1)}```')))
    if 'skip' in parsed_args:
        i = parsed_args.skip
        if not 0 <= i < len(scheduled_command.services.get(
                server_name, list())):
            asyncio.create_task(
                discord_service.get_service_manager().send_message(
                    discord_service.Response(server_name, 'Invalid index')))
        else:
            await scheduled_command.get_service_manager(
                server_name,
                i).send_message(scheduled_command.Skip(server_name))
    if parsed_args.kill:
        sys.exit(0)
    if parsed_args.version:
        asyncio.create_task(discord_service.get_service_manager().send_message(
            discord_service.Response(server_name,
                                     f'{carim_discord_bot.VERSION}')))