Advertisement
Sanlover

main.py

Jan 17th, 2021
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.20 KB | None | 0 0
  1. import discord
  2. import time
  3. from discord.ext import commands
  4. import config
  5.  
  6.  
  7. def to_fixed(num, digits=0):
  8.     return f"{num:.{digits}f}"
  9.  
  10.  
  11. intents = discord.Intents.default()
  12. Intents = intents.all()
  13.  
  14.  
  15. admin_roles_ids = config.admin_roles_ids
  16. active_voice_channels = []
  17. banned_voice_channels = config.banned_voice_channels
  18. banned_users_ids = config.banned_users_ids
  19. active_users_time_starts = {}
  20. GUILD_ID = config.guild_id
  21. LOG_CHANNEL_ID = config.log_channel_id
  22. TOKEN = config.token
  23. DATA_FILE_NAME = config.data_file_name
  24.  
  25. client = commands.Bot(command_prefix='!', intents=Intents)
  26.  
  27.  
  28. # checks if member is admin
  29. async def is_admin(ctx):
  30.     role_ids = admin_roles_ids
  31.     for role_id in role_ids:
  32.         role = discord.utils.get(ctx.guild.roles, id=role_id)
  33.         if role in ctx.author.roles:
  34.             return True
  35.         else:
  36.             return False
  37.  
  38.  
  39. @client.command(pass_context=True)
  40. async def set_seconds(ctx, user_id, amount):
  41.     if await is_admin(ctx):
  42.         user_id = int(user_id)
  43.         amount = int(amount)
  44.         if amount >= 0:
  45.             pre_hours = config.saved_base[user_id]
  46.             config.saved_base[user_id] = amount
  47.             await ctx.guild.get_channel(LOG_CHANNEL_ID).send(
  48.                 f'|{time.ctime()}| {ctx.author.name} изменил количество секунд '
  49.                 f'у {ctx.guild.get_member(user_id) } с {pre_hours} на {config.saved_base[user_id]}')
  50.         else:
  51.             ctx.message.reply('Количество секунд должно быть >= 0')
  52.     else:
  53.         await ctx.message.reply('У тебя недостаточно прав для этого')
  54.  
  55.  
  56. @client.command(pass_context=True)
  57. async def stats(ctx):
  58.     message = ''
  59.     for saved_member in config.saved_base:
  60.         temp = f'[{to_fixed(config.saved_base[saved_member]/3600.0,3):^7}]' + f'{client.get_user(saved_member).name:^20}'
  61.         message += temp + '\n'
  62.  
  63.     result = str(f"""```{message}```""")
  64.     embed = discord.Embed(title="")
  65.     embed.add_field(name="Таблица часов", value=result)
  66.     await ctx.message.reply(embed=embed)
  67.  
  68.  
  69. @client.command(pass_context=True)
  70. async def info(ctx):
  71.     message = '!info    - помогает разобраться в команадах\n' \
  72.               '!stats   - выводит таблицу всего сервера в формате часов\n' \
  73.               '!any     - выводит время, выбирая формат автоматически\n' \
  74.               '!hours   - выводит время в формате часов\n' \
  75.               '!minutes - выводит время в формате минут\n' \
  76.               '!seconds - выводит время в формате секунд\n' \
  77.               '--------------------------------------------------------\n' \
  78.               '!set_seconds [user_id] [seconds_amount] - sets seconds'
  79.  
  80.     result = str(f"""```{message}```""")
  81.     embed = discord.Embed(title="")
  82.     embed.add_field(name="Информация о командах", value=result)
  83.     await ctx.message.reply(embed=embed)
  84.  
  85.  
  86. @client.command(pass_context=True)
  87. async def auto(ctx):
  88.     author = ctx.message.author
  89.     times = config.saved_base[author.id]
  90.     if times / 3600 > 1:
  91.         await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id] / 3600.0, 3)} часов')
  92.     elif times / 60 > 1:
  93.         await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id] / 60.0, 3)} минут')
  94.     else:
  95.         await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id], 3)} секунд')
  96.  
  97.  
  98. @client.command(pass_context=True)
  99. async def hours(ctx):
  100.     author = ctx.message.author
  101.     await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id] / 3600.0, 3)} часов')
  102.  
  103.  
  104. @client.command(pass_context=True)
  105. async def minutes(ctx):
  106.     author = ctx.message.author
  107.     await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id] / 60.0, 3)} минут')
  108.  
  109.  
  110. @client.command(pass_context=True)
  111. async def seconds(ctx):
  112.     author = ctx.message.author
  113.     await ctx.message.reply(f'Ты провёл здесь уже {to_fixed(config.saved_base[author.id], 3)} секунд')
  114.  
  115.  
  116. # event, that starts firstly
  117. @client.event
  118. async def on_ready():
  119.     # Getting guild from client
  120.     guild = client.get_guild(GUILD_ID)
  121.  
  122.     # Sending log to channel
  123.     await guild.get_channel(LOG_CHANNEL_ID).send(
  124.         f'|{time.ctime()}| {client.user} успешно подключился к серверу: {guild.name}(id: {guild.id})')
  125.  
  126.     # Making voice channels list
  127.     all_voice_channels = guild.voice_channels
  128.     for voice_channel in all_voice_channels:
  129.         is_banned = False
  130.         for banned_ids in banned_voice_channels:
  131.             if voice_channel.id == banned_ids:
  132.                 is_banned = True
  133.                 break
  134.         if not is_banned:
  135.             active_voice_channels.append(voice_channel.id)
  136.  
  137.     # Trying to load base
  138.     # Logging
  139.     message = 'База данных загружена, загруженность данными: ' + str(len(config.saved_base)) + '\n'
  140.  
  141.     # Adding users if someone is missed and not banned
  142.     all_members = guild.members
  143.     for member in all_members:
  144.         is_banned = False
  145.         for banned_id in banned_users_ids:
  146.             if member.id == banned_id:
  147.                 is_banned = True
  148.                 break
  149.         if not is_banned:
  150.             is_found = False
  151.             for saved_member in config.saved_base:
  152.                 if member.id == saved_member:
  153.                     is_found = True
  154.                     break
  155.             if not is_found:
  156.                 config.saved_base[member.id] = 0.0
  157.  
  158.     # Logging
  159.     for saved_member in config.saved_base:
  160.         temp = f'[{to_fixed(config.saved_base[saved_member]/3600.0,3):^7}]' + f'{client.get_user(saved_member).name:^20}'
  161.         message += temp + '\n'
  162.     await guild.get_channel(LOG_CHANNEL_ID).send(message)
  163.  
  164.  
  165. @client.event
  166. async def on_voice_state_update(member, before, after):
  167.  
  168.     # Logging and processing
  169.     message = f'|{time.ctime()}| {member}'
  170.     if before.channel is None:
  171.         active_users_time_starts[member.id] = time.time()
  172.         message += f' зашёл в "{after.channel.name}"'
  173.     elif after.channel is None:
  174.         if member.id in active_users_time_starts:
  175.             time_by_session = time.time() - active_users_time_starts[member.id]
  176.             active_users_time_starts.pop(member.id)
  177.             config.saved_base[member.id] += time_by_session
  178.             message += f' покинул сервер из "{before.channel.name}"'
  179.     elif after.channel == before.channel:
  180.         if before.self_mute and not after.self_mute:
  181.             message += ' включил микрофон'
  182.         else:
  183.             message += ' выключил микрофон'
  184.     else:
  185.         message += f' перешёл из "{before.channel.name}" в "{after.channel.name}"'
  186.     await client.get_guild(GUILD_ID).get_channel(LOG_CHANNEL_ID).send(message)
  187.  
  188.  
  189. client.run(TOKEN)
  190.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement