Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import discord
- import time
- from discord.ext import commands
- import config
- def to_fixed(num, digits=0):
- return f"{num:.{digits}f}"
- intents = discord.Intents.default()
- Intents = intents.all()
- admin_roles_ids = config.admin_roles_ids
- active_voice_channels = []
- banned_voice_channels = config.banned_voice_channels
- banned_users_ids = config.banned_users_ids
- active_users_time_starts = {}
- GUILD_ID = config.guild_id
- LOG_CHANNEL_ID = config.log_channel_id
- TOKEN = config.token
- DATA_FILE_NAME = config.data_file_name
- client = commands.Bot(command_prefix='!', intents=Intents)
- # checks if member is admin
- async def is_admin(ctx):
- role_ids = admin_roles_ids
- for role_id in role_ids:
- role = discord.utils.get(ctx.guild.roles, id=role_id)
- if role in ctx.author.roles:
- return True
- else:
- return False
- @client.command(pass_context=True)
- async def set_seconds(ctx, user_id, amount):
- if await is_admin(ctx):
- user_id = int(user_id)
- amount = int(amount)
- if amount >= 0:
- pre_hours = config.saved_base[user_id]
- config.saved_base[user_id] = amount
- await ctx.guild.get_channel(LOG_CHANNEL_ID).send(
- f'|{time.ctime()}| {ctx.author.name} изменил количество секунд '
- f'у {ctx.guild.get_member(user_id) } с {pre_hours} на {config.saved_base[user_id]}')
- else:
- ctx.message.reply('Количество секунд должно быть >= 0')
- else:
- await ctx.message.reply('У тебя недостаточно прав для этого')
- @client.command(pass_context=True)
- async def stats(ctx):
- message = ''
- for saved_member in config.saved_base:
- temp = f'[{to_fixed(config.saved_base[saved_member]/3600.0,3):^7}]' + f'{client.get_user(saved_member).name:^20}'
- message += temp + '\n'
- result = str(f"""```{message}```""")
- embed = discord.Embed(title="")
- embed.add_field(name="Таблица часов", value=result)
- await ctx.message.reply(embed=embed)
- @client.command(pass_context=True)
- async def info(ctx):
- message = '!info - помогает разобраться в команадах\n' \
- '!stats - выводит таблицу всего сервера в формате часов\n' \
- '!any - выводит время, выбирая формат автоматически\n' \
- '!hours - выводит время в формате часов\n' \
- '!minutes - выводит время в формате минут\n' \
- '!seconds - выводит время в формате секунд\n' \
- '--------------------------------------------------------\n' \
- '!set_seconds [user_id] [seconds_amount] - sets seconds'
- result = str(f"""```{message}```""")
- embed = discord.Embed(title="")
- embed.add_field(name="Информация о командах", value=result)
- await ctx.message.reply(embed=embed)
- @client.command(pass_context=True)
- async def auto(ctx):
- author = ctx.message.author
- times = config.saved_base[author.id]
- if times / 3600 > 1:
- await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id] / 3600.0, 3)} часов')
- elif times / 60 > 1:
- await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id] / 60.0, 3)} минут')
- else:
- await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id], 3)} секунд')
- @client.command(pass_context=True)
- async def hours(ctx):
- author = ctx.message.author
- await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id] / 3600.0, 3)} часов')
- @client.command(pass_context=True)
- async def minutes(ctx):
- author = ctx.message.author
- await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id] / 60.0, 3)} минут')
- @client.command(pass_context=True)
- async def seconds(ctx):
- author = ctx.message.author
- await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id], 3)} секунд')
- # event, that starts firstly
- @client.event
- async def on_ready():
- # Getting guild from client
- guild = client.get_guild(GUILD_ID)
- # Sending log to channel
- await guild.get_channel(LOG_CHANNEL_ID).send(
- f'|{time.ctime()}| {client.user} успешно подключился к серверу: {guild.name}(id: {guild.id})')
- # Making voice channels list
- all_voice_channels = guild.voice_channels
- for voice_channel in all_voice_channels:
- is_banned = False
- for banned_ids in banned_voice_channels:
- if voice_channel.id == banned_ids:
- is_banned = True
- break
- if not is_banned:
- active_voice_channels.append(voice_channel.id)
- # Trying to load base
- # Logging
- message = 'База данных загружена, загруженность данными: ' + str(len(config.saved_base)) + '\n'
- # Adding users if someone is missed and not banned
- all_members = guild.members
- for member in all_members:
- is_banned = False
- for banned_id in banned_users_ids:
- if member.id == banned_id:
- is_banned = True
- break
- if not is_banned:
- is_found = False
- for saved_member in config.saved_base:
- if member.id == saved_member:
- is_found = True
- break
- if not is_found:
- config.saved_base[member.id] = 0.0
- # Logging
- for saved_member in config.saved_base:
- temp = f'[{to_fixed(config.saved_base[saved_member]/3600.0,3):^7}]' + f'{client.get_user(saved_member).name:^20}'
- message += temp + '\n'
- await guild.get_channel(LOG_CHANNEL_ID).send(message)
- @client.event
- async def on_voice_state_update(member, before, after):
- # Logging and processing
- message = f'|{time.ctime()}| {member}'
- if before.channel is None:
- active_users_time_starts[member.id] = time.time()
- message += f' зашёл в "{after.channel.name}"'
- elif after.channel is None:
- if member.id in active_users_time_starts:
- time_by_session = time.time() - active_users_time_starts[member.id]
- active_users_time_starts.pop(member.id)
- config.saved_base[member.id] += time_by_session
- message += f' покинул сервер из "{before.channel.name}"'
- elif after.channel == before.channel:
- if before.self_mute and not after.self_mute:
- message += ' включил микрофон'
- else:
- message += ' выключил микрофон'
- else:
- message += f' перешёл из "{before.channel.name}" в "{after.channel.name}"'
- await client.get_guild(GUILD_ID).get_channel(LOG_CHANNEL_ID).send(message)
- client.run(TOKEN)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement