예제 #1
0
 async def schedule_command(self):
     interval = self.command['interval']
     if self.command.get('with_clock', False):
         await self.wait_for_aligned_time()
     else:
         time_left = interval
         while time_left > 0:
             self.command['next'] = time_left
             await asyncio.sleep(2)
             time_left -= 2
     self.command['next'] = 'now'
     if self.command.get('skip', False):
         await discord_service.get_service_manager().send_message(
             discord_service.Log(
                 self.server_name,
                 f'Skipping scheduled command: {self.command.get("command")}'
             ))
         del self.command['skip']
     else:
         if self.command.get('command') == 'safe_shutdown':
             await rcon_service.get_service_manager(
                 self.server_name).send_message(
                     rcon_service.SafeShutdown(self.server_name,
                                               self.command.get('delay',
                                                                0)))
         else:
             await rcon_service.get_service_manager(
                 self.server_name).send_message(
                     rcon_service.Command(self.server_name,
                                          self.command['command']))
예제 #2
0
async def process_chat(server_name, message):
    chat_message = f'Discord> {message.author.display_name}: {message.content}'
    if len(chat_message) > 128:
        await message.channel.send(f'Message too long: {chat_message}')
        return
    rcon_message = rcon_service.Command(server_name, f'say -1 {chat_message}')
    await rcon_service.get_service_manager(server_name).send_message(
        rcon_message)
    try:
        await rcon_message.result
    except asyncio.CancelledError:
        await message.channel.send(f'Failed to send: {chat_message}')
예제 #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}')))