From c46421267a478dc2e3f820a9581bdec075faee23 Mon Sep 17 00:00:00 2001 From: dan63047 Date: Mon, 13 May 2024 16:02:44 +0300 Subject: [PATCH] init from 2021 --- .gitignore | 11 + 19471.ttf | Bin 0 -> 70612 bytes README.md | 8 + aprint/__init__.py | 1 + aprint/aprint.py | 39 + av.png | Bin 0 -> 40358 bytes bot.log | 8 + main.py | 1603 ++++++++++++++++++++++++++++++++++++++++++ midnight.py | 228 ++++++ stats.png | Bin 0 -> 59134 bytes stats_all.png | Bin 0 -> 12554 bytes stats_all_guilds.png | Bin 0 -> 10126 bytes 12 files changed, 1898 insertions(+) create mode 100644 .gitignore create mode 100644 19471.ttf create mode 100644 README.md create mode 100644 aprint/__init__.py create mode 100644 aprint/aprint.py create mode 100644 av.png create mode 100644 bot.log create mode 100644 main.py create mode 100644 midnight.py create mode 100644 stats.png create mode 100644 stats_all.png create mode 100644 stats_all_guilds.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..974d773 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# Contains bot token +data.json + +# You not supposted to see this +horny_poster.py +horny_data.json + +# shit +.idea +.vscode +aprint/__pycache__ \ No newline at end of file diff --git a/19471.ttf b/19471.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9466430fb0e25772dcf024c46bdfa181e3ba5eb0 GIT binary patch literal 70612 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 u#K{ST-#i~jPEwA@^ZLjw^ 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 str: + if zero < dtfrom: + tdelta = dtfrom - zero + negative = True + else: + tdelta = zero - dtfrom + negative = False + if tdelta.days == 0 and temp is None: show_days = False + if show_days: + d = {"D": tdelta.days} + hours, rem = divmod(tdelta.seconds, 3600) + minutes, seconds = divmod(rem, 60) + d["H"] = '{:02d}'.format(hours) + d["M"] = '{:02d}'.format(minutes) + d["S"] = '{:02d}'.format(seconds) + if temp is None: + if negative: + t = DeltaTemplate('- %D дн. %H:%M:%S') + else: + t = DeltaTemplate('%D дн. %H:%M:%S') + else: + if negative: + t = DeltaTemplate('-'+temp) + else: + t = DeltaTemplate(temp) + return t.substitute(**d) + else: + d = {"D": tdelta.days} + hours, rem = divmod(tdelta.seconds, 3600) + minutes, seconds = divmod(rem, 60) + hours += d["D"]*24 + d["H"] = hours + d["M"] = '{:02d}'.format(minutes) + d["S"] = '{:02d}'.format(seconds) + if temp is None: + if negative: + t = DeltaTemplate('-%H:%M:%S') + else: + t = DeltaTemplate('%H:%M:%S') + else: + if negative: + t = DeltaTemplate('-'+temp) + else: + t = DeltaTemplate(temp) + return t.substitute(**d) + +def hi_msg_temp(user_mention, full_username, temp): + d = {"user_mention": user_mention, "full_username": full_username} + return DeltaTemplate(temp).substitute(**d) + +def widget_temp(temp): + d = {"until_new_year": strfdelta(datetime.datetime(year=datetime.datetime.utcnow().year, month=12, day=31, hour=21, minute=0), datetime.datetime.utcnow(), False, "%Hч%Mм"), + "next_year": str(datetime.datetime.now().year + 1)} + return DeltaTemplate(temp).substitute(**d) + +def can_use_it(dude, guild_id): + has_role = False + if data['bot-data'][str(guild_id)].get("role_access"): + for i in dude.roles: + if i.id == data['bot-data'][str(guild_id)]["role_access"]: + has_role = True + if dude.id == data['main-data']['owner_id'] or dude.id == data['bot-data'][str(guild_id)]['access'] or has_role: + return True + else: + return False + +def count_active(dude_id, guild_id, len_of_message, len_of_attachment): + global ACTIVE_TOTAL + if not data['bot-data'][str(guild_id)]['active'].get(str(dude_id)): + data['bot-data'][str(guild_id)]['active'][str(dude_id)] = len_of_message + len_of_attachment*10 + else: + message_limit = 30 + if len_of_message > message_limit: + data['bot-data'][str(guild_id)]['active'][str(dude_id)] += message_limit + len_of_attachment*10 + ACTIVE_TOTAL += message_limit + len_of_attachment*10 + else: + data['bot-data'][str(guild_id)]['active'][str(dude_id)] += len_of_message + len_of_attachment*10 + ACTIVE_TOTAL += len_of_message + len_of_attachment*10 + +async def get_image_stats(msg): + avatar = await msg.author.avatar_url_as(format="png", size=256).read() + image_file = open("av.png", "wb") + image_file.write(avatar) + image_file.close() + X = 1000 + Y = 400 + a = str(msg.author.id) + active_role_level = -1 + if data['bot-data'][str(msg.guild.id)].get("roles") and data['bot-data'][str(msg.guild.id)].get("active_roles"): + if len(data['bot-data'][str(msg.guild.id)]['roles']) == len(data['bot-data'][str(msg.guild.id)]['active_roles']): + for i in msg.author.roles: + for ar in data['bot-data'][str(msg.guild.id)]["roles"]: + if i.id == ar: + active_role_level = data['bot-data'][str(msg.guild.id)]["roles"].index(ar) + show_progress_to_next_role = True + if active_role_level != len(data['bot-data'][str(msg.guild.id)]["roles"])-1: + string_next_role = f'До роли "{utils.get(msg.guild.roles, id=data["bot-data"][str(msg.guild.id)]["roles"][active_role_level+1]).name}"' + user_next_role_active = data['bot-data'][str(msg.guild.id)]["active_roles"][active_role_level+1] + if active_role_level == -1: + user_currect_role = "Неактивный" + user_currect_role_active = 0 + else: + user_currect_role = utils.get(msg.guild.roles, id=data['bot-data'][str(msg.guild.id)]["roles"][active_role_level]).name + user_currect_role_active = data['bot-data'][str(msg.guild.id)]["active_roles"][active_role_level] + else: + show_progress_to_next_role = False + user_next_role_active = data['bot-data'][str(msg.guild.id)]["active"][a] + user_currect_role = utils.get(msg.guild.roles, id=data['bot-data'][str(msg.guild.id)]["roles"][active_role_level]).name + user_currect_role_active = 0 + else: + show_progress_to_next_role = False + user_next_role_active = data['bot-data'][str(msg.guild.id)]["active"][a] + user_currect_role = f"Ролей: {len(data['bot-data'][str(msg.guild.id)]['roles'])}, требований: {len(data['bot-data'][str(msg.guild.id)]['active_roles'])}. Настройте бота!" + user_currect_role_active = 0 + else: + show_progress_to_next_role = False + user_next_role_active = data['bot-data'][str(msg.guild.id)]["active"][a] + user_currect_role = "" + user_currect_role_active = 0 + place = sorted(data['bot-data'][str(msg.guild.id)]["active"], key=lambda i: data['bot-data'][str(msg.guild.id)]["active"][i], reverse=True).index(a)+1 + bar_offset = ((user_next_role_active - user_currect_role_active) - (data['bot-data'][str(msg.guild.id)]['active'][a] - user_currect_role_active)) / (user_next_role_active - user_currect_role_active) * (X - 100) + im = Image.new("RGB", (X, Y), (25, 25, 25)) + draw = ImageDraw.Draw(im) + av_pil = Image.open("av.png") + av_r = av_pil.resize((164, 164)) + font = ImageFont.truetype("19471.ttf", 50) + big_font = ImageFont.truetype("19471.ttf", 130) + small_font = ImageFont.truetype("19471.ttf", 30) + draw.line((50, Y - 50, X - 50, Y - 50), (0, 0, 0), 33) + draw.line((50, Y - 50, X - 50 - bar_offset, Y - 50), (255, 255, 255), 33) + draw.text((230, 50), msg.author.display_name, font=font) + draw.text((230, 160), user_currect_role, font=font) + draw.text((230, 100), f"#{place} на сервере {msg.guild.name}\nПрисоединился {strfdelta(datetime.datetime.utcnow(), msg.author.joined_at, data['bot-data'][str(msg.guild.id)]['days_in_timedelta'])} назад", font=small_font) + size3 = font.getsize(locale.format_string("%d", user_next_role_active - data['bot-data'][str(msg.guild.id)]['active'][a], grouping=True)) + if show_progress_to_next_role: + size1 = small_font.getsize(string_next_role) + draw.text((X - size1[0] - 50 , Y-135), string_next_role, font=small_font, align="right") + draw.text((X - size3[0] - 50 , Y-110), locale.format_string("%d", user_next_role_active - data['bot-data'][str(msg.guild.id)]['active'][a], grouping=True), font=font, align="right") + im.paste(av_r, (50, 50, 214, 214)) + draw.text((50, Y - 170), locale.format_string("%d", data['bot-data'][str(msg.guild.id)]['active'][a], grouping=True), font=big_font) + im.save("stats.png", "png") + +async def get_image_stats_all(msg): + Y = 145 + font = ImageFont.truetype("19471.ttf", 50) + lower_hat_font = ImageFont.truetype("19471.ttf", 30) + longest_name_size_x = font.getsize(msg.guild.name)[0] + for u in data['bot-data'][str(msg.guild.id)]["active"]: + try: + name = client.get_guild(msg.guild.id).get_member(int(u)).display_name + except Exception: + member = requests.get(f"https://discordapp.com/api/users/{u}", headers={'Authorization': f'Bot {data["main-data"]["token"]}'}) + if member.ok: + member = member.json() + name = f"{member['username']}#{member['discriminator']}" + else: + name = f"id{u}" + name_size_x = lower_hat_font.getsize(name)[0] + Y += 30 + longest_name_size_x = max(longest_name_size_x, name_size_x) + X = longest_name_size_x + 140 + lower_hat_font.getsize("Актив")[0] + 10 + im = Image.new("RGB", (X, Y), (25, 25, 25)) + draw = ImageDraw.Draw(im) + title = msg.guild.name + draw.text((X / 2 - font.getsize(title)[0] / 2, 5), title, font=font) + draw.text((10, 60), "Пользователь", font=lower_hat_font) + draw.text((longest_name_size_x + 140, 60), "Актив", font=lower_hat_font) + start_table_y = 100 + to_draw = sorted(data['bot-data'][str(msg.guild.id)]["active"], key=lambda i: data['bot-data'][str(msg.guild.id)]["active"][i], reverse=True) + all_a = 0 + for u in to_draw: + try: + name = client.get_guild(msg.guild.id).get_member(int(u)).display_name + except Exception: + member = requests.get(f"https://discordapp.com/api/users/{u}", headers={'Authorization': f'Bot {data["main-data"]["token"]}'}) + if member.ok: + member = member.json() + name = f"{member['username']}#{member['discriminator']}" + else: + name = f"id{u}" + draw.text((10, start_table_y), name, font=lower_hat_font) + size_a = lower_hat_font.getsize(locale.format_string("%d", data['bot-data'][str(msg.guild.id)]["active"][u], grouping=True)) + draw.text((longest_name_size_x + 140 + lower_hat_font.getsize("Актив")[0] - size_a[0], start_table_y), locale.format_string("%d", data['bot-data'][str(msg.guild.id)]["active"][u], grouping=True), font=lower_hat_font) + start_table_y += 30 + all_a += data['bot-data'][str(msg.guild.id)]["active"][u] + start_table_y += 10 + draw.text((10, start_table_y), "Весь сервер:", font=lower_hat_font) + size_a = lower_hat_font.getsize(locale.format_string("%d", all_a, grouping=True)) + draw.text((longest_name_size_x + 140 + lower_hat_font.getsize("Актив")[0] - size_a[0], start_table_y), locale.format_string("%d", all_a, grouping=True), font=lower_hat_font) + im.save("stats_all.png", "png") + +async def get_image_stats_all_guilds(msg): + Y = 145 + font = ImageFont.truetype("19471.ttf", 50) + lower_hat_font = ImageFont.truetype("19471.ttf", 30) + longest_name_size_x = font.getsize("Актив всех серверов")[0] + guilds = {} + for g in data['bot-data']: + if g != "counters": + name = client.get_guild(int(g)).name + name_size_x = lower_hat_font.getsize(name)[0] + Y += 30 + longest_name_size_x = max(longest_name_size_x, name_size_x) + active = sum( + data['bot-data'][g]["active"][m] + for m in data["bot-data"][g]["active"] + ) + guilds[g] = {'name': name, 'active': active} + X = longest_name_size_x + 140 + lower_hat_font.getsize("Актив")[0] + 10 + im = Image.new("RGB", (X, Y), (25, 25, 25)) + draw = ImageDraw.Draw(im) + title = "Актив всех серверов" + draw.text((X / 2 - font.getsize(title)[0] / 2, 5), title, font=font) + draw.text((10, 60), "Сервер", font=lower_hat_font) + draw.text((longest_name_size_x + 140, 60), "Актив", font=lower_hat_font) + start_table_y = 100 + to_draw = sorted(guilds, key=lambda i: guilds[i]["active"], reverse=True) + all_a = 0 + for u in to_draw: + draw.text((10, start_table_y), guilds[u]["name"], font=lower_hat_font) + size_a = lower_hat_font.getsize(locale.format_string("%d", guilds[u]["active"], grouping=True)) + draw.text((longest_name_size_x + 140 + lower_hat_font.getsize("Актив")[0] - size_a[0], start_table_y), locale.format_string("%d", guilds[u]["active"], grouping=True), font=lower_hat_font) + start_table_y += 30 + all_a += guilds[u]["active"] + start_table_y += 10 + draw.text((10, start_table_y), "Все сервера:", font=lower_hat_font) + size_a = lower_hat_font.getsize(locale.format_string("%d", all_a, grouping=True)) + draw.text((longest_name_size_x + 140 + lower_hat_font.getsize("Актив")[0] - size_a[0], start_table_y), locale.format_string("%d", all_a, grouping=True), font=lower_hat_font) + im.save("stats_all_guilds.png", "png") + +@client.event +async def on_ready(): + log(f'Logged in Discord as {client.user}') + global NEW_YEAR_STATS + NEW_YEAR_STATS = data['bot-data']["new_year_event"] + for g in data['bot-data']: + if g != "counters" and g != "new_year_event": + if data['bot-data'][g]['state'] != 'normal': + data['bot-data'][g]['state'] = 'normal' + NEW_YEAR_NOTIFYED[g] = False + if not NEW_YEAR_STATS.get(g): + NEW_YEAR_STATS[g] = {'cooldown': 1638835200, "times_used": {}, "type_used":{"ban": 0, "not_ban": 0}, "victums": {}, "longest_mute":None, "shortest_mute":None} + + +@client.event +async def on_message(message): + if isinstance(message.channel, discord.TextChannel): + if message.author == client.user: + counters.incriment("dc-s") + m = message.content.replace("\n", "⁞") + log(f'Bot in {message.guild} #{message.channel}: "{m}", attachments: {message.attachments}') + else: + m = message.content.replace("\n", "⁞") + log(f'{message.author} in {message.guild} #{message.channel}: "{m}", attachments: {message.attachments}') + counters.incriment("dc-r") + if not data['bot-data'].get(str(message.guild.id)): + data['bot-data'][str(message.guild.id)] = {"active": {}, "muted": {}, "banned": {}, "count_channel": 1, "access": message.guild.owner_id, "state": "normal", "command_prefix": "$", 'can_ban': False, 'react_on_join_leave_members': False, 'days_in_timedelta': True, "days_for_spam": 1} + if not data.get("game"): + data['game'] = {} + if not USERS_LAST_ACTIVE.get(str(message.guild.id)): + USERS_LAST_ACTIVE[str(message.guild.id)] = {str(message.author.id): datetime.datetime(2020, 1, 1)} + if not USERS_LAST_MESSAGE.get(str(message.guild.id)): + USERS_LAST_MESSAGE[str(message.guild.id)] = {str(message.author.id): ""} + if not USERS_FLOOD_COUNTER.get(str(message.guild.id)): + USERS_FLOOD_COUNTER[str(message.guild.id)] = {str(message.author.id): 0} + if not USERS_LAST_ACTIVE[str(message.guild.id)].get(str(message.author.id)): + USERS_LAST_ACTIVE[str(message.guild.id)][str(message.author.id)] = datetime.datetime(2020, 1, 1) + if not USERS_LAST_MESSAGE[str(message.guild.id)].get(str(message.author.id)): + USERS_LAST_MESSAGE[str(message.guild.id)][str(message.author.id)] = "" + if not USERS_FLOOD_COUNTER[str(message.guild.id)].get(str(message.author.id)): + USERS_FLOOD_COUNTER[str(message.guild.id)][str(message.author.id)] = 0 + + if not message.author.bot and (message.content != "" or len(message.attachments) > 0) and (USERS_LAST_MESSAGE[str(message.guild.id)][str(message.author.id)] != message.content or len(message.attachments) > 0): + count_active(message.author.id, message.guild.id, len(message.content), len(message.attachments)) + + if data['bot-data'][str(message.guild.id)].get("mute_role") and data['bot-data'][str(message.guild.id)].get('flood_limit'): + invite_search = re.search(r"discord\.gg\/\w+", message.content) + if invite_search is not None and not can_use_it(message.author, message.guild.id): + USERS_FLOOD_COUNTER[str(message.guild.id)][str(message.author.id)] = data['bot-data'][str(message.guild.id)]['flood_limit'] + await message.delete() + elif 747797669648269364 in message.raw_role_mentions: + USERS_FLOOD_COUNTER[str(message.guild.id)][str(message.author.id)] += 3 + elif len(message.attachments) == 0 and (USERS_LAST_MESSAGE[str(message.guild.id)][str(message.author.id)] == message.content or (message.created_at - USERS_LAST_ACTIVE[str(message.guild.id)][str(message.author.id)]) < datetime.timedelta(0, 2,5)): + USERS_FLOOD_COUNTER[str(message.guild.id)][str(message.author.id)] += 1 + elif USERS_FLOOD_COUNTER[str(message.guild.id)][str(message.author.id)] > 0: + USERS_FLOOD_COUNTER[str(message.guild.id)][str(message.author.id)] -= 1 + if USERS_FLOOD_COUNTER[str(message.guild.id)][str(message.author.id)] >= data['bot-data'][str(message.guild.id)]['flood_limit']: + role = utils.get(message.guild.roles, id=data['bot-data'][str(message.guild.id)]['mute_role']) + await message.author.add_roles(role) + now = datetime.datetime.utcnow() + mute = datetime.timedelta(days=1) + mute_time = now + mute + data['bot-data'][str(message.guild.id)]['muted'][str(message.author.id)] = {"timestamp": mute_time.timestamp(), "reason": "Спам", "by_id": client.user.id, "done": datetime.datetime.utcnow().timestamp()} + emb = discord.Embed(description=f"От {client.user.mention} специально для {message.author.mention}\n**Срок молчалки:** {strfdelta(now+mute, now, data['bot-data'][str(message.guild.id)]['days_in_timedelta'])}", title=f"Молчалка за спам", timestamp=mute_time, colour=0x0000ff) + emb.set_author(name=f"{message.author.name} (Ник: {message.author.nick})", icon_url=message.author.avatar_url) + await message.channel.send(f"Ты в муте за спам {message.author.mention}", embed=emb) + USERS_FLOOD_COUNTER[str(message.guild.id)][str(message.author.id)] = 0 + + USERS_LAST_MESSAGE[str(message.guild.id)][str(message.author.id)] = message.content + USERS_LAST_ACTIVE[str(message.guild.id)][str(message.author.id)] = message.created_at + + if data['bot-data'][str(message.guild.id)].get("roles") and data['bot-data'][str(message.guild.id)].get("active_roles") and not message.author.bot: + if len(data['bot-data'][str(message.guild.id)]['roles']) == len(data['bot-data'][str(message.guild.id)]['active_roles']): + active_role_level = -1 + for i in message.author.roles: + for ar in data['bot-data'][str(message.guild.id)]["roles"]: + if i.id == ar: + active_role_level = data['bot-data'][str(message.guild.id)]["roles"].index(ar) + for ari in data['bot-data'][str(message.guild.id)]['roles']: + if active_role_level != len(data['bot-data'][str(message.guild.id)]['roles'])-1: + if data['bot-data'][str(message.guild.id)]["active"][str(message.author.id)] >= int(data['bot-data'][str(message.guild.id)]['active_roles'][data['bot-data'][str(message.guild.id)]['roles'].index(ari)]) and active_role_level < data['bot-data'][str(message.guild.id)]['roles'].index(ari): + role = utils.get(message.guild.roles, id=ari) + await message.author.add_roles(role) + text = f"{message.author.mention}, вы проявили достаточно актива для получения роли \"{role.name}\", поздравляю" + if data['bot-data'][str(message.guild.id)].get('notify_channel'): + await message.guild.get_channel(data['bot-data'][str(message.guild.id)]['notify_channel']).send(text) + else: + await message.channel.send(text) + role = utils.get(message.guild.roles, id=data['bot-data'][str(message.guild.id)]['roles'][active_role_level]) + await message.author.remove_roles(role) + + if data['bot-data'][str(message.guild.id)].get("count_log"): + if message.channel.id == data['bot-data'][str(message.guild.id)]["count_log"] and message.author != client.user: + try: + if int(message.content) == data['bot-data'][str(message.guild.id)]["count_channel"]: + data['bot-data'][str(message.guild.id)]["count_channel"] += 1 + if data['bot-data'][str(message.guild.id)].get("roles_count"): + if (data['bot-data'][str(message.guild.id)]["count_channel"]-1) % 10000 == 0: + role = utils.get(message.guild.roles, id=data['bot-data'][str(message.guild.id)]["roles_count"][3]) + await message.author.add_roles(role) + await message.pin() + elif (data['bot-data'][str(message.guild.id)]["count_channel"]-1) % 1000 == 0: + role = utils.get(message.guild.roles, id=data['bot-data'][str(message.guild.id)]["roles_count"][2]) + await message.author.add_roles(role) + await message.pin() + elif (data['bot-data'][str(message.guild.id)]["count_channel"]-1) == 500: + role = utils.get(message.guild.roles, id=data['bot-data'][str(message.guild.id)]["roles_count"][1]) + await message.author.add_roles(role) + await message.pin() + elif (data['bot-data'][str(message.guild.id)]["count_channel"]-1) == 100: + role = utils.get(message.guild.roles, id=data['bot-data'][str(message.guild.id)]["roles_count"][0]) + await message.author.add_roles(role) + await message.pin() + else: + if (data['bot-data'][str(message.guild.id)]["count_channel"]-1) % 10000 == 0: + await message.pin() + elif (data['bot-data'][str(message.guild.id)]["count_channel"]-1) % 1000 == 0: + await message.pin() + elif (data['bot-data'][str(message.guild.id)]["count_channel"]-1) == 500: + await message.pin() + elif (data['bot-data'][str(message.guild.id)]["count_channel"]-1) == 100: + await message.pin() + else: + await message.delete() + except ValueError: + await message.delete() + if message.content.lower() == "бот дай денег": + await message.channel.send("Иди нахуй") + with open("data.json", "w") as jsn: + json.dump(data, jsn) + elif isinstance(message.channel, discord.DMChannel): + log(f'Message in {message.channel} by "{message.author}": "{message.content}", attachments: {message.attachments}') + if message.content == "reboot" and message.author.id == data['main-data']['owner_id']: + await message.channel.send(f"Перезагружаюсь") + exit("Got command to exit") + if message.content == "ъ": + await message.channel.send(f"ь") + else: + log(message) + +@client.event +async def on_error(event, *args, **kwargs): + counters.incriment("e") + exc = sys.exc_info() + logging.error(f"Exception {exc[0]} in {event}: {exc[1]}", exc_info=exc) + +@client.event +async def on_guild_join(guild): + log(f"We joined to {guild}") + data['bot-data'][str(guild.id)] = {"active": {}, "muted": {}, "banned": {}, "count_channel": 1, "access": guild.owner_id, "state": "normal", 'can_ban': False, 'react_on_join_leave_members': False, 'days_in_timedelta': True, "days_for_spam": 1} + await guild.system_channel.send(f"Доброго времени суток. Спасибо, что пригласили меня на свой сервер. Используйте команду /help, чтобы узнать о моих возможностях") + with open("data.json", "w") as jsn: + json.dump(data, jsn) + +@client.event +async def on_member_join(member): + log(f"Joined member {member} to guild {member.guild}") + muted = False + banned = False + for u in data['bot-data'][str(member.guild.id)]["muted"]: + if u == str(member.id): + role = utils.get(member.guild.roles, id=data['bot-data'][str(member.guild.id)]['mute_role']) + await member.add_roles(role) + muted = True + for u in data['bot-data'][str(member.guild.id)]["banned"]: + if u == str(member.id): + banned = True + if banned: + mesg = await member.guild.system_channel.send(f'Персонаж из бан листа {member.name}#{member.discriminator} осмелился ступить на сервер. Что-ж, банхаммер на готове.') + await member.ban(reason=data['bot-data'][str(member.guild.id)]["banned"][str(member.id)]['reason']) + elif muted: + strtimediff = strfdelta(datetime.datetime.fromtimestamp(data["bot-data"][str(member.guild.id)]["muted"][str(member.id)]["timestamp"]), datetime.datetime.utcnow(), data['bot-data'][str(member.guild.id)]['days_in_timedelta']) + mesg = await member.guild.system_channel.send(f'Ку, {member.mention}. На этом сервере ты получил мут от <@{data["bot-data"][str(member.guild.id)]["muted"][str(member.id)]["by_id"]}> за "{data["bot-data"][str(member.guild.id)]["muted"][str(member.id)]["reason"]}" и он истекает через {strtimediff}') + elif data['bot-data'][str(member.guild.id)].get("role_for_verification"): + if not data['bot-data'][str(member.guild.id)].get('hi_msg'): + mesg = await member.guild.system_channel.send(f'Добро пожаловать, {member.mention}. Чтобы получить роль участника "{utils.get(member.guild.roles, id=data["bot-data"][str(member.guild.id)]["role_for_verification"]).name}" и получить доступ к серверу, поставьте реакцию на это сообщение.') + else: + mesg = await member.guild.system_channel.send(hi_msg_temp(member.mention, f"{member.name}#{member.discriminator}", data['bot-data'][str(member.guild.id)]['hi_msg']) + f'\nЧтобы получить роль участника "{utils.get(member.guild.roles, id=data["bot-data"][str(member.guild.id)]["role_for_verification"]).name}" и получить доступ к серверу, поставьте реакцию на это сообщение.') + elif data['bot-data'][str(member.guild.id)]["react_on_join_leave_members"]: + if not data['bot-data'][str(member.guild.id)].get('hi_msg'): + await member.guild.system_channel.send(f'Добро пожаловать, {member.mention}') + else: + await member.guild.system_channel.send(hi_msg_temp(member.mention, f"{member.name}#{member.discriminator}", data['bot-data'][str(member.guild.id)]['hi_msg'])) + if data['bot-data'][str(member.guild.id)].get("role_for_verification"): + await mesg.add_reaction("✅") + if not TO_VERIFY.get(str(member.guild.id)): + TO_VERIFY[str(member.guild.id)] = [] + TO_VERIFY[str(member.guild.id)].append(member.id) + if data['bot-data'][str(member.guild.id)].get("admin_log"): + emb = discord.Embed(description=f"**Дата регистрации:** {member.created_at.strftime('%d.%m.%Y %H:%M:%S UTC')}\n**Cуществует уже:** {strfdelta(datetime.datetime.utcnow(), member.created_at, data['bot-data'][str(member.guild.id)]['days_in_timedelta'])}", title=f"Новый пользователь на сервере", timestamp=member.joined_at, colour=0xd1e9ef) + emb.set_author(name=f"{member.name}#{member.discriminator}", icon_url=member.avatar_url) + emb.set_footer(text=f"User ID: {member.id}, Bot: {member.bot}") + await client.get_channel(data['bot-data'][str(member.guild.id)]['admin_log']).send(embed=emb) + +@client.event +async def on_member_remove(member): + log(f"Removed member {member} from guild {member.guild}") + if data['bot-data'][str(member.guild.id)].get("admin_log"): + emb = discord.Embed(description=f"**Дата регистрации:** {member.created_at.strftime('%d.%m.%Y %H:%M:%S UTC')}\n**Cуществует уже:** {strfdelta(datetime.datetime.utcnow(), member.created_at, data['bot-data'][str(member.guild.id)]['days_in_timedelta'])}\n**Пробыл на сервере**: {strfdelta(datetime.datetime.utcnow(), member.joined_at, data['bot-data'][str(member.guild.id)]['days_in_timedelta'])}", title=f"Пользователь покинул сервер", timestamp=member.joined_at, colour=0xff0000) + emb.set_author(name=f"{member.name}#{member.discriminator}", icon_url=member.avatar_url) + emb.set_footer(text=f"User ID: {member.id}, Bot: {member.bot}") + await client.get_channel(data['bot-data'][str(member.guild.id)]['admin_log']).send(embed=emb) + if data['bot-data'][str(member.guild.id)]["react_on_join_leave_members"]: + await member.guild.system_channel.send(f'{member} покинул сервер. Он пробыл здесь всего {strfdelta(datetime.datetime.utcnow(), member.joined_at, data["bot-data"][str(member.guild.id)]["days_in_timedelta"])}') + +@client.event +async def on_raw_reaction_add(payload): + if TO_VERIFY.get(str(payload.guild_id)) and data['bot-data'][str(payload.guild_id)].get("role_for_verification"): + for i in TO_VERIFY[str(payload.guild_id)]: + if i == payload.user_id: + TO_VERIFY[str(payload.guild_id)].remove(i) + await payload.member.add_roles(utils.get(client.get_guild(payload.guild_id).roles, id=data['bot-data'][str(payload.guild_id)]["role_for_verification"])) + +@client.event +async def on_raw_message_delete(payload): + if data['bot-data'][str(payload.guild_id)].get("admin_log"): + if payload.cached_message: + emb = discord.Embed(title="Было удалено сообщение", description=payload.cached_message.content, timestamp=payload.cached_message.created_at, colour=0xff0000) + emb.set_author(name=f"{payload.cached_message.author.name} (Ник: {payload.cached_message.author.nick}) #{payload.cached_message.channel}", icon_url=payload.cached_message.author.avatar_url) + if payload.cached_message.attachments: + for i in payload.cached_message.attachments: + emb.add_field(name="Прикреплено", value=i.filename, inline=False) + if payload.cached_message.reactions: + reactions = "" + for i in payload.cached_message.reactions: + if reactions == "": + reactions += f"{i.emoji} **{i.count}**" + else: + reactions += f", {i.emoji} **{i.count}**" + emb.add_field(name=f"Реакций: {len(payload.cached_message.reactions)}", value=reactions, inline=False) + else: + emb = discord.Embed(title="Было удалено сообщение", description="Сообщения не было в кеше бота", colour=0xff0000) + await client.get_channel(data['bot-data'][str(payload.guild_id)]['admin_log']).send(embed=emb) + +@client.event +async def on_member_update(before, after): + if data['bot-data'][str(before.guild.id)].get("admin_log"): + if after.nick != before.nick: + emb = discord.Embed(title="Пользователь изменил свой ник на сервере", colour=0x00ff00) + if before.nick is not None: + emb.add_field(name="Старый ник", value=before.nick) + else: + emb.add_field(name="Старый ник", value="**Нет ника**") + if after.nick is not None: + emb.add_field(name="Новый ник", value=after.nick) + else: + emb.add_field(name="Новый ник", value="**Нет ника**") + emb.set_author(name=after.name, icon_url=after.avatar_url) + await client.get_channel(data['bot-data'][str(before.guild.id)]['admin_log']).send(embed=emb) + +@client.event +async def on_member_ban(guild, user): + log(f"Banned in {guild}: {user}") + if data['bot-data'][str(guild.id)].get("admin_log"): + emb = discord.Embed(title="Пользователь был забанен", description=f"**Дата регистрации:** {user.created_at.strftime('%d.%m.%Y %H:%M:%S UTC')}\n**Cуществует уже:** {strfdelta(datetime.datetime.utcnow(), user.created_at, data['bot-data'][str(guild.id)]['mute_role'])}\n**Пробыл на сервере**: {strfdelta(datetime.datetime.utcnow(), user.joined_at, data['bot-data'][str(guild.id)]['mute_role'])}", colour=0xff0000) + emb.set_author(name=f"{user.name}#{user.discriminator}", icon_url=user.avatar_url) + emb.set_footer(text=f"User ID: {user.id}, Bot: {user.bot}") + await client.get_channel(data['bot-data'][str(guild.id)]['admin_log']).send(embed=emb) + +@client.event +async def on_member_unban(guild, user): + log(f"Unbanned in {guild}: {user}") + if data['bot-data'][str(guild.id)].get("admin_log"): + emb = discord.Embed(title="Пользователь был разбанен", description=f"**Дата регистрации:** {user.created_at.strftime('%d.%m.%Y %H:%M:%S UTC')}\n**Cуществует уже:** {strfdelta(datetime.datetime.utcnow(), user.created_at, data['bot-data'][str(guild.id)]['mute_role'])}", colour=0x00ff00) + emb.set_author(name=f"{user.name}#{user.discriminator}", icon_url=user.avatar_url) + emb.set_footer(text=f"User ID: {user.id}, Bot: {user.bot}") + await client.get_channel(data['bot-data'][str(guild.id)]['admin_log']).send(embed=emb) + +@client.event +async def on_invite_create(invite): + if data['bot-data'][str(invite.guild.id)].get("admin_log"): + emb = discord.Embed(title="Была создана ссылка-приглашение", description=invite.url, timestamp=invite.created_at, colour=0x0000ff) + emb.add_field(name="Канал", value=invite.channel.mention) + if invite.max_age > 0 and invite.max_age != None: + emb.add_field(name="Срок действия", value=f"{strfdelta(invite.created_at+datetime.timedelta(0, invite.max_age), invite.created_at, data['bot-data'][str(invite.guild.id)]['mute_role'])}\n(до {(invite.created_at+datetime.timedelta(0, invite.max_age)).strftime('%d.%m.%Y %H:%M:%S UTC')})") + else: + emb.add_field(name="Срок действия", value="Вечная ссылка") + if invite.max_uses > 0 and invite.max_uses != None: + emb.add_field(name="Лимит на использование", value=f"{invite.max_uses} раз") + if invite.temporary: + emb.add_field(name="Ссылка предоставляет временное членство", value="Если временным учасникам не выдадут роль, они автоматически будут кикнуты") + emb.set_author(name=invite.inviter.display_name, icon_url=invite.inviter.avatar_url) + await client.get_channel(data['bot-data'][str(invite.guild.id)]['admin_log']).send(embed=emb) + +@client.event +async def on_invite_delete(invite): + if data['bot-data'][str(invite.guild.id)].get("admin_log"): + emb = discord.Embed(title="Была удалена ссылка-приглашение", description=invite.url, colour=0xff0000) + emb.add_field(name="Канал", value=invite.channel.mention) + await client.get_channel(data['bot-data'][str(invite.guild.id)]['admin_log']).send(embed=emb) + +@client.event +async def on_raw_message_edit(payload): + if data['bot-data'][payload.data['guild_id']].get("admin_log"): + emb = discord.Embed(title="Было отредактировано сообщение", description=f"**Отредактировано:** {datetime.datetime.strptime(payload.data['edited_timestamp'], '%Y-%m-%dT%H:%M:%S.%f%z').strftime('%d.%m.%Y %H:%M:%S UTC')}", timestamp=datetime.datetime.strptime(payload.data['timestamp'], "%Y-%m-%dT%H:%M:%S.%f%z"), colour=0x0000ff) + if payload.cached_message: + emb.set_author(name=f"{payload.cached_message.author.name} (Ник: {payload.cached_message.author.nick}) #{payload.cached_message.channel}", icon_url=payload.cached_message.author.avatar_url) + emb.add_field(name="Старый текст", value=payload.cached_message.content, inline=True) + else: + emb.set_author(name=f"{payload.data['author']['username']}") + emb.add_field(name="Сообщения не было в кеше бота", value="Невозможно показать разницу", inline=True) + emb.add_field(name="Новый текст", value=payload.data['content'], inline=True) + await client.get_channel(data['bot-data'][payload.data['guild_id']]['admin_log']).send(embed=emb) + +@client.event +async def on_guild_remove(guild): + log(f"We left from {guild}") + global ACTIVE_TOTAL + for m in data['bot-data'][str(guild.id)]['active']: + ACTIVE_TOTAL -= data['bot-data'][str(guild.id)]['active'][m] + del data['bot-data'][str(guild.id)] + +@slash.slash(name="help", description="Справочный материал с описанием команд бота") +async def help(ctx): + emb = discord.Embed(title="Справочный материал с описанием команд бота", description="Эта справка призвана помочь разобраться в командах бота") + emb.add_field(name=f"/random *X* *Y*", value="Генерирует рандомное число от *X* до *Y*. Если *Y* нету, то тогда от 0 до *X*. Если и *X* нет, то тогда от 0 до 10") + emb.add_field(name=f"/stats *choice*", value="Посмотреть актив, который насчитал бот для вас, а если после команды написать *all*, то можно посмотреть актив, который насчитал бот для всего сервера") + #emb.add_field(name=f"{data['bot-data'][str(ctx.guild.id)]['command_prefix']}кнб *камень/ножницы/бумага/стат*", value='Сыграть в "Камень, ножницы, бумага" с ботом, если приписать аргумент *стат*, можно увидеть количесво побед, поражений и ничей') + emb.add_field(name=f"/slap *@user*", value='Шлёпнуть *@user* или рандомного персонажа на сервере, если не упомянут') + if can_use_it(ctx.author, ctx.guild.id): + emb.add_field(name=f"/settings", value="Даёт возможность перенастроить бота") + if data['bot-data'][str(ctx.guild.id)].get("mute_role"): + emb.add_field(name=f"/mute *@user* *[s, m, h, d, w]/DD.MM.YYYY* *reason*", value="Выдать молчалку пользователю. Команда имеет 2 обязательных аргумента: *@user* - упоминание персоны; *[s, m, h, d, w]/DD.MM.YYYY* - либо срок в относительном формате (30m - 30 минут, 7d - 7 дней), либо дата. Есть также 3-ий необязательный аргумент: *reason* - причина мута.") + emb.add_field(name=f"/unmute *@user*", value="Cнять молчалку с пользователя. *@user* - упоминание персоны") + emb.add_field(name=f"/mute_list", value="Показать активные на сервере молчалки") + if data['bot-data'][str(ctx.guild.id)]["can_ban"]: + emb.add_field(name=f"/ban *@user* *[s, m, h, d, w]/DD.MM.YYYY* *reason*", value="Забанить пользователя. Команда имеет 2 обязательных аргумента: *@user* - упоминание персоны; *[s, m, h, d, w]/DD.MM.YYYY* - либо срок в относительном формате (30m - 30 минут, 7d - 7 дней), либо дата. Есть также 3-ий необязательный аргумент: *reason* - причина бана.") + emb.add_field(name=f"/unban *id*", value="Разбанить пользователя, которого забанили командой /ban. *id* - его цифровой id") + emb.add_field(name=f"/ban_list", value="Показать активные на сервере баны") + await ctx.send(embed=emb) + +@slash.slash(name="random", description="Отправляет рандомное число от X до Y", + options=[create_option(name="x_int", description="Наименьшее число если используется вместе с y_int, иначе число больше нуля", option_type=4, required=False), + create_option(name="y_int", description="Наибольшее число", option_type=4, required=False)]) +async def randon(ctx, **kwargs): + if "y_int" in kwargs and "x_int" in kwargs: + emb = discord.Embed(title="Рандомное число") + emb.add_field(name="От", value=kwargs["x_int"], inline=True) + emb.add_field(name="До", value=kwargs["y_int"], inline=True) + emb.add_field(name="**Результат**", value=locale.format_string('**%d**', random.randint(kwargs["x_int"], kwargs["y_int"]), grouping=True), inline=False) + elif "x_int" in kwargs: + emb = discord.Embed(title="Рандомное число") + emb.add_field(name="От", value="0", inline=True) + emb.add_field(name="До", value=kwargs["x_int"], inline=True) + emb.add_field(name="**Результат**", value=locale.format_string('**%d**', random.randint(0, kwargs["x_int"]), grouping=True), inline=False) + else: + emb = discord.Embed(title="Рандомное число") + emb.add_field(name="От", value="0", inline=True) + emb.add_field(name="До", value="10", inline=True) + emb.add_field(name="**Результат**", value=locale.format_string('**%d**', random.randint(0, 10), grouping=True), inline=False) + + await ctx.send(embed=emb) + +# , permissions={ + # 747583006322983053:[ + # create_permission(747583006322983053, discord_slash.model.SlashCommandPermissionType.ROLE, False), + # create_permission(747879784364769331, discord_slash.model.SlashCommandPermissionType.ROLE, True) + # ] + #} +@slash.slash(name="debug", description="Позволяет узнать состояние бота", options=[ + create_option(name="applet", description="Название конкретной штуки, информацию о которой надо узнать", option_type=3, required=True, choices=[ + create_choice(name="Общая информация", value="default"), + create_choice(name="Антиспам система", value="spam"), + create_choice(name="Cчётчики", value="counters"), + create_choice(name="Время работы бота", value="uptime") + ]) + ]) +async def deb(ctx, applet): + if applet == "default": + await ctx.send(debug()) + elif applet == "spam": + answer = f"**Работа антиспам системы**\nДанный массив - то, как видит ситуацию антиспам система бота. На уровне *{data['bot-data'][str(ctx.guild.id)]['flood_limit']}* или выше - выдаёт мут на 1 день.\n" + for u in USERS_FLOOD_COUNTER[str(ctx.guild.id)]: + member = ctx.guild.get_member(u) + answer += f"\n{member} - {USERS_FLOOD_COUNTER[str(ctx.guild.id)][u]}" + await ctx.send(answer) + elif applet == "counters": + await ctx.send(counters_print()) + elif applet == "uptime": + await ctx.send(uptime_rate()) + +@slash.slash(name="stats", description="Бот отправит информацию о набранных очках актива", options=[ + create_option(name="choice", description=" Количество очков актива чего вам нужно узнать?", option_type=3, required=True, choices=[ + create_choice(name="Обо мне", value="me"), + create_choice(name="О сервере", value="server"), + create_choice(name="Таблица серверов", value="all servers") + ]) +]) +async def stats(ctx, choice): + if choice == "me": + await get_image_stats(ctx) + await ctx.send(file=discord.File("stats.png")) + elif choice == "server": + await get_image_stats_all(ctx) + await ctx.send(file=discord.File("stats_all.png")) + elif choice == "all servers": + await get_image_stats_all_guilds(ctx) + await ctx.send(file=discord.File("stats_all_guilds.png")) + +@slash.slash(name="slap", description="Шлёпнуть кого-нибудь))))))", options=[ + create_option(name="user", description="Выберите пользователя для шлепка, иначе будет выбран рандомный", option_type=6, required=False) +]) +async def slap(ctx, **kwargs): + guy = kwargs['user'] if "user" in kwargs else random.choice(ctx.guild.members) + await ctx.send(f"{ctx.author.mention} шлёпнул {guy.mention}") + +@slash.slash(name="gift", description="Подарить либо мешочек с нихуя, либо мут от 1 секунды до 2 часов") +async def new_year_present(ctx): + START_TIME = 1638835200 + END_TIME = 1641513600 + dt_now = datetime.datetime.utcnow() + now = dt_now.timestamp() + global NEW_YEAR_STATS + global NEW_YEAR_NOTIFYED + if not NEW_YEAR_STATS.get(str(ctx.guild.id)): + NEW_YEAR_STATS[str(ctx.guild.id)] = {'cooldown': START_TIME, "times_used": {}, "type_used":{"ban": 0, "not_ban": 0}, "victums": {}, "longest_mute":None, "shortest_mute":None} + if NEW_YEAR_STATS[str(ctx.guild.id)]["cooldown"] <= now: + victim = random.choice(ctx.guild.members) + mute = random.randint(0, 1) + if mute: + reason = "Новогодний подарок" + for_ban = victim + if data['bot-data'][str(ctx.guild.id)].get('mute_role'): + role = utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['mute_role']) + await for_ban.add_roles(role) + mute_time = random.randint(1, 7200) + data['bot-data'][str(ctx.guild.id)]['muted'][str(for_ban.id)] = {"timestamp": now + mute_time, "reason": reason, "by_id": ctx.author.id, "done": now} + emb = discord.Embed(description=f"От <@{ctx.author.id}> рандомному персонажу на сервере, которым оказался <@{for_ban.id}>\n**Подарок:** молчалка сроком {strfdelta(datetime.datetime.utcfromtimestamp(now + mute_time), dt_now, False)}", title=f"Новогодний подарок", timestamp=datetime.datetime.fromtimestamp(now + mute_time), colour=0x0000ff) + emb.set_author(name=f"{for_ban.name} (Ник: {for_ban.nick})", icon_url=for_ban.avatar_url) + emb.set_footer(text="Действует до") + else: + emb = discord.Embed(description=f"От <@{ctx.author.id}> рандомному персонажу на сервере, которым оказался <@{victim.id}>\n**Подарок:** мешочек с нихуя", title=f"Новогодний подарок", colour=0x0000ff, image="https://sun9-41.userapi.com/impf/c849128/v849128784/b0a1/GXEDUAUp-3A.jpg?size=200x200&quality=96&sign=3bb33aaba78a34581f46ed63e11c4725&type=album") + emb.set_author(name=f"{victim.name} (Ник: {victim.nick})", icon_url=victim.avatar_url) + + if not NEW_YEAR_STATS[str(ctx.guild.id)]["times_used"].get(str(ctx.author.id)): + NEW_YEAR_STATS[str(ctx.guild.id)]["times_used"][str(ctx.author.id)] = 1 + else: + NEW_YEAR_STATS[str(ctx.guild.id)]["times_used"][str(ctx.author.id)] += 1 + if not NEW_YEAR_STATS[str(ctx.guild.id)]["victums"].get(str(victim.id)): + NEW_YEAR_STATS[str(ctx.guild.id)]["victums"][str(victim.id)] = 1 + else: + NEW_YEAR_STATS[str(ctx.guild.id)]["victums"][str(victim.id)] += 1 + if mute: + NEW_YEAR_STATS[str(ctx.guild.id)]["type_used"]["ban"] += 1 + if NEW_YEAR_STATS[str(ctx.guild.id)]["longest_mute"] == None or NEW_YEAR_STATS[str(ctx.guild.id)]["longest_mute"][0] < mute_time: + NEW_YEAR_STATS[str(ctx.guild.id)]["longest_mute"] = [mute_time, victim.id, ctx.author.id] + if NEW_YEAR_STATS[str(ctx.guild.id)]["shortest_mute"] == None or NEW_YEAR_STATS[str(ctx.guild.id)]["shortest_mute"][0] > mute_time: + NEW_YEAR_STATS[str(ctx.guild.id)]["shortest_mute"] = [mute_time, victim.id, ctx.author.id] + else: + NEW_YEAR_STATS[str(ctx.guild.id)]["type_used"]["not_ban"] += 1 + + if (dt_now.day == 31 and dt_now.month == 12) or (dt_now.day == 1 and dt_now.month == 1): + cooldown = now + 900 + text_cd = "Команда снова будет доступна через 15 минут" + elif dt_now.day == 30 and dt_now.month == 12: + cooldown = now + 3600 + text_cd = "Команда снова будет доступна через 60 минут" + elif dt_now.day >= 25 and dt_now.month == 12: + cooldown = now + 7200 + text_cd = "Команда снова будет доступна через 2 часа" + elif dt_now.day >= 20 and dt_now.month == 12: + cooldown = now + 10800 + text_cd = "Команда снова будет доступна через 3 часа" + elif dt_now.day >= 15 and dt_now.month == 12: + cooldown = now + 14400 + text_cd = "Команда снова будет доступна через 4 часа" + elif dt_now.day >= 10 and dt_now.month == 12: + cooldown = now + 18000 + text_cd = "Команда снова будет доступна через 5 часов" + elif dt_now.day >= 7 and (dt_now.month == 12 or dt_now.month == 1): + cooldown = now + 21600 + text_cd = "Команда снова будет доступна через 6 часов" + if cooldown >= END_TIME: + text_cd += ". Это будет последний подарок" + else: + cooldown = datetime.datetime(dt_now.year, 12, 7).timestamp() + text_cd = f'Ивент завершён. Статистика за {dt_now.year-1}-{dt_now.year} года:\nВсего было подарков: {NEW_YEAR_STATS[str(ctx.guild.id)]["type_used"]["ban"]+NEW_YEAR_STATS[str(ctx.guild.id)]["type_used"]["not_ban"]}, из которых было молчалок: {NEW_YEAR_STATS[str(ctx.guild.id)]["type_used"]["ban"]}, мешочков с нихуя: {NEW_YEAR_STATS[str(ctx.guild.id)]["type_used"]["not_ban"]}' + NEW_YEAR_STATS[str(ctx.guild.id)]["cooldown"] = cooldown + await ctx.send(f"Держи, {victim.mention}. {text_cd}", embed=emb) + data['bot-data']["new_year_event"] = NEW_YEAR_STATS + with open("data.json", "w") as jsn: + json.dump(data, jsn) + NEW_YEAR_NOTIFYED[str(ctx.guild.id)] = False + else: + await ctx.send(f"Новый сюрприз можно будет устроить через {strfdelta(datetime.datetime.fromtimestamp(NEW_YEAR_STATS[str(ctx.guild.id)]['cooldown']), dt_now, False)}", delete_after=15) + +@slash.slash(name="settings", description="Настройте бота на вашем сервере", options=[ + create_option(name="setting", description="Выберите необходимую настройку", option_type=3, required=True, choices=[ + create_choice(name="Роль доступа к боту", value="access_role"), + create_choice(name="Канал уведомлений", value="notify_channel"), + create_choice(name="Дни в отображении разницы времени", value="days_in_timedelta"), + create_choice(name="Роль мута", value="mute_role"), + create_choice(name="Лимит антифлуд системы", value="flood_limit"), + create_choice(name="Бан командой", value="can_ban"), + create_choice(name="Реагировать на приход/уход участников", value="join_leave"), + create_choice(name="Шаблон приветствия нового пользователя", value="hi_msg"), + create_choice(name="Роль верификации", value="role_for_verification"), + create_choice(name="Канал для лога событий сервера", value="admin_log"), + create_choice(name="Список ролей за актив", value="active_roles"), + create_choice(name="Список требований за роли актива", value="active_for_roles"), + create_choice(name="Канал для счёта", value="counting"), + create_choice(name="Список ролей в канале счёта", value="roles_for_count") + ]), + create_option(name="value", description="Укажите, чтобы изменить настройку, иначе бот отправит значение настройки", option_type=3, required=False) +]) +async def sett(ctx, **kwargs): # sourcery skip: merge-else-if-into-elif + if can_use_it(ctx.author, ctx.guild.id): + if kwargs['setting'] == "access_role": + if "value" in kwargs: + if kwargs['value'].lower() == "clear": + if data['bot-data'][str(ctx.guild.id)].get("role_access"): + del data['bot-data'][str(ctx.guild.id)]['role_access'] + await ctx.send(f"Особый доступ к боту будете иметь только вы") + else: + try: + data['bot-data'][str(ctx.guild.id)]['role_access'] = int(kwargs['value']) + await ctx.send(f"Роль {utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['role_access']).mention} будет использоваться для доступа к боту.") + except Exception as e: + await ctx.send(f"Некорректное значение\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("role_access"): + await ctx.send(f"Особый доступ к боту есть только у {ctx.author}\nЧтобы установить роль с особым доступом, напишите её id в аргументе *value*") + else: + await ctx.send(f"Особый досуп к боту имеют все, у кого есть роль \"{utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['role_access'])}\"\nЧтобы установить роль с особым доступом, напишите её id в аргументе *value*\n Чтобы удалить роль, в аргументе *value* напишите \"clear\"") + elif kwargs["setting"] == "notify_channel": + if "value" in kwargs: + if kwargs["value"].lower() == "clear": + del data['bot-data'][str(ctx.guild.id)]['notify_channel'] + await ctx.send(f"Уведомления о размуте, разбане и повышении роли выключены") + else: + try: + data['bot-data'][str(ctx.guild.id)]['notify_channel'] = int(kwargs['value']) + await ctx.send(f"Канал {utils.get(ctx.guild.channels, id=data['bot-data'][str(ctx.guild.id)]['notify_channel'])} будет использоваться для уведомлений о размуте, разбане и повышении роли") + except Exception as e: + await ctx.send(f"Некорректное значение\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("notify_channel"): + await ctx.send(f"Канал для уведомлений о размуте, разбане и повышении роли не указан\nЧтобы включить, напишите его id в аргументе *value*") + else: + await ctx.send(f"Канал для уведомлений о размуте, разбане и повышении роли: {utils.get(ctx.guild.channels, id=data['bot-data'][str(ctx.guild.id)]['notify_channel'])}\nЧтобы изменить канал для админ-лога, напишите его id в аргументе *value*\nЧтобы выключить админ-лог, в аргументе *value* напишите \"clear\"") + elif kwargs["setting"] == "days_in_timedelta": + if "value" in kwargs: + if kwargs["value"] in STRING_TRUE: + data['bot-data'][str(ctx.guild.id)]['days_in_timedelta'] = True + await ctx.send(f"Формат разницы времени: *дни* дн. *часы*:*минуты*:*секунды*") + elif kwargs["value"] in STRING_FALSE: + data['bot-data'][str(ctx.guild.id)]['days_in_timedelta'] = False + await ctx.send(f"Формат разницы времени: *дни в часах+часы*:*минуты*:*секунды*") + else: + await ctx.send(f"Некорректное значение", delete_after=10) + else: + await ctx.send(f"Флаг формата разницы времени: {data['bot-data'][str(ctx.guild.id)]['days_in_timedelta']}\nЧтобы изменить, укажите в аргументе *value* булево значение (True или False)") + elif kwargs["setting"] == "mute_role": + if "value" in kwargs: + if kwargs['value'].lower() == "clear": + if data['bot-data'][str(ctx.guild.id)].get("mute_role"): + del data['bot-data'][str(ctx.guild.id)]['mute_role'] + await ctx.send(f"Молчалка отключена") + else: + try: + data['bot-data'][str(ctx.guild.id)]['mute_role'] = int(kwargs['value']) + await ctx.send(f"Роль {utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['mute_role']).mention} будет использоваться для молчалки.") + except Exception as e: + await ctx.send(f"Некорректное значение\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("mute_role"): + await ctx.send(f"Молчалка отключена\nЧтобы включить, напишите id роли, которая запрещает отправлять сообщения, в аргументе *value*") + else: + await ctx.send(f"Роль молчалки: \"{utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['mute_role'])}\"\nЧтобы изменить роль молчалки, напишите id роли, которая запрещает отправлять сообщения, в аргументе *value*\n Чтобы удалить роль, в аргументе *value* напишите \"clear\"") + elif kwargs["setting"] == "flood_limit": + if not data['bot-data'][str(ctx.guild.id)].get("mute_role"): + await ctx.send("Молчалка отключена\nОна нужна в качестве наказания за флуд") + elif "value" in kwargs: + try: + if int(kwargs['value']) > 0: + data['bot-data'][str(ctx.guild.id)]['flood_limit'] = int(kwargs['value']) + await ctx.send(f"Лимит на флуд: {data['bot-data'][str(ctx.guild.id)]['flood_limit']} одинаковых/быстро отправленных сообщений подряд") + elif int(kwargs['value']) == 0: + del data['bot-data'][str(ctx.guild.id)]['flood_limit'] + await ctx.send("Лимит на флуд выключен") + else: + await ctx.send("Лимит должен быть больше нуля или ноль, если хотите выключить", delete_after=10) + except Exception as e: + await ctx.send(f"Некорректное значение\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get('flood_limit'): + await ctx.send("Наказание отключено\nЧтобы включить, укажите в аргументе *value*, сколько сообщений флуда можно написать перед полученем наказания") + else: + await ctx.send(f"Лимит анти-флуд системы: {data['bot-data'][str(ctx.guild.id)]['flood_limit']} одинаковых/быстро отправленных сообщений\nЧтобы изменить, укажите в аргументе *value*, сколько сообщений флуда можно написать перед полученем наказания, или 0, чтобы отключить систему") + elif kwargs["setting"] == "can_ban": + if "value" in kwargs: + if kwargs["value"] in STRING_TRUE: + data['bot-data'][str(ctx.guild.id)]['can_ban'] = True + await ctx.send(f"Теперь можно банить людей через команду `/ban`") + elif kwargs["value"] in STRING_FALSE: + data['bot-data'][str(ctx.guild.id)]['can_ban'] = False + await ctx.send(f"Команда `/ban` выключена") + else: + await ctx.send(f"Некорректное значение", delete_after=10) + else: + await ctx.send(f"Можно банить через команду бота: {data['bot-data'][str(ctx.guild.id)]['can_ban']}\nЧтобы изменить, укажите в аргументе *value* булево значение (True или False)") + elif kwargs["setting"] == "join_leave": + if "value" in kwargs: + if kwargs["value"] in STRING_TRUE: + data['bot-data'][str(ctx.guild.id)]['react_on_join_leave_members'] = True + await ctx.send(f"Бот будет реагировать на приход/уход участников") + elif kwargs["value"] in STRING_FALSE: + data['bot-data'][str(ctx.guild.id)]['react_on_join_leave_members'] = False + await ctx.send(f"Бот не будет реагировать на приход/уход участников") + else: + await ctx.send(f"Некорректное значение", delete_after=10) + else: + await ctx.send(f"Реагировать на приход на сервер и уход с него участников: {data['bot-data'][str(ctx.guild.id)]['react_on_join_leave_members']}\nЧтобы изменить, укажите в аргументе *value* булево значение (True или False)") + elif kwargs["setting"] == "hi_msg": + if "value" in kwargs: + if kwargs["value"].lower() == "clear": + del data['bot-data'][str(ctx.guild.id)]['hi_msg'] + await ctx.send("Будет использоваться стандартный шаблон приветствия") + else: + data['bot-data'][str(ctx.guild.id)]['hi_msg'] = kwargs["value"] + await ctx.send(f"Новый шаблон приветствия: {data['bot-data'][str(ctx.guild.id)]['hi_msg']}") + else: + if not data['bot-data'][str(ctx.guild.id)].get('hi_msg'): + await ctx.send(f"Используется стандартный шаблон приветствия\nЧтобы изменить, в аргументе *value* напишите шаблон сообщения. В нём могут быть такие элементы, как `%user_mention` (упоминание новичка) и `%full_username` (полный ник новичка)") + else: + await ctx.send(f"Шаблон приветствия: {data['bot-data'][str(ctx.guild.id)]['hi_msg']}\nЧтобы изменить, в аргументе *value* напишите шаблон сообщения. В нём могут быть такие элементы, как `%user_mention` (упоминание новичка) и `%full_username` (полный ник новичка)\nЕсли он больше не нужен, после аргумента напишите \"clear\"") + elif kwargs["setting"] == "role_for_verification": + if "value" in kwargs: + if kwargs['value'].lower() == "clear": + if data['bot-data'][str(ctx.guild.id)].get("role_for_verification"): + del data['bot-data'][str(ctx.guild.id)]['role_for_verification'] + await ctx.send(f"Верификация отключена") + else: + try: + data['bot-data'][str(ctx.guild.id)]['role_for_verification'] = int(kwargs['value']) + await ctx.send(f"Роль {utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['role_for_verification'])} будет использоваться для верификации.") + except Exception as e: + await ctx.send(f"Некорректное значение\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("role_for_verification"): + await ctx.send(f"Верификация отключена\nЧтобы включить, напишите id роли верификации в аргументе *value*") + else: + await ctx.send(f"Роль верификации: \"{utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['role_for_verification']).name}\"\nЧтобы изменить роль верификации, напишите её id в аргументе *value*\nЧтобы выключить верификацию, в аргументе *value* напишите \"clear\"") + elif kwargs["setting"] == "admin_log": + if "value" in kwargs: + if kwargs["value"].lower() == "clear": + del data['bot-data'][str(ctx.guild.id)]['admin_log'] + await ctx.send(f"Уведомления о размуте, разбане и повышении роли выключены") + else: + try: + data['bot-data'][str(ctx.guild.id)]['admin_log'] = int(kwargs['value']) + await ctx.send(f"Канал {utils.get(ctx.guild.channels, id=data['bot-data'][str(ctx.guild.id)]['admin_log'])} будет использоваться для уведомлений о размуте, разбане и повышении роли") + except Exception as e: + await ctx.send(f"Некорректное значение\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("admin_log"): + await ctx.send(f"Канал админ-лога не указан\nЧтобы включить, напишите id канала для админ-лога в аргументе *value*") + else: + await ctx.send(f"Канал админ-лога: \"{utils.get(ctx.guild.channels, id=data['bot-data'][str(ctx.guild.id)]['admin_log'])}\"\nЧтобы изменить канал для админ-лога, напишите его id в аргументе *value*\nЧтобы выключить админ-лог, в аргументе *value* напишите \"clear\"") + elif kwargs["setting"] == "active_roles": + if "value" in kwargs: + lst = kwargs["value"].split(" ") + try: + for l in lst: + int(l) + data['bot-data'][str(ctx.guild.id)]['roles'] = lst + answer = "Новый порядок ролей:" + for role in data['bot-data'][str(ctx.guild.id)]['roles']: + answer += f" <@&{role}>" + if data['bot-data'][str(ctx.guild.id)].get('active_roles'): + if len(data['bot-data'][str(ctx.guild.id)]['roles']) != len(data['bot-data'][str(ctx.guild.id)]['active_roles']): + answer += "\nРекомендую также изменить требуемый актив за роли, так как кол-во ролей и требований за них не совпадает" + else: + answer += "\nРекомендую также изменить награды за актив, так как они не назначены" + await ctx.send(answer) + except Exception as e: + await ctx.send(f"Ошибка\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("roles"): + await ctx.send("Роли за актив не установлены\nЧтобы это сделать, в аргументе *value* напишите id ролей по очереди, от самой менее значимой до самой крутой роли за актив через пробел") + else: + answer = "Порядок ролей:" + for role in data['bot-data'][str(ctx.guild.id)]['roles']: + answer += f" <@&{role}>" + answer +="\nЧтобы изменить, в аргументе *value* напишите id ролей по очереди, от самой менее значимой до самой крутой роли за актив через пробел\nЛибо после аргумента напишите \"clear\"" + await ctx.send(answer) + elif kwargs["setting"] == "active_for_roles": + if not data['bot-data'][str(ctx.guild.id)].get("roles"): + await ctx.send("Роли за актив не установлены\nИспользуйте `/settings setting:Список ролей за актив` чтобы узнать подробнее") + elif "value" in kwargs: + lst = kwargs["value"].split(" ") + try: + for l in lst: + int(l) + data['bot-data'][str(ctx.guild.id)]['active_roles'] = lst + answer = "Требуемый вами актив:" + for n in data['bot-data'][str(ctx.guild.id)]['active_roles']: + answer += f" {n}" + await ctx.send(answer) + except Exception as e: + await ctx.send(f"Ошибка\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("active_roles"): + await ctx.send("Требования для ролей за актив не установлены\nЧтобы это сделать, напишите в аргументе *value* требуемый актив за роли по очереди через пробел, от самой менее значимой до самой крутой роли за актив") + else: + answer = "Требуемый актив за роли:" + for role in data['bot-data'][str(ctx.guild.id)]['active_roles']: + answer += f" {role}" + answer +="\nЧтобы изменить, напишите в аргументе *value* требуемый актив за роли по очереди через пробел, от самой менее значимой до самой крутой роли за актив\nЛибо после аргумента напишите \"clear\"" + await ctx.send(answer) + elif kwargs["setting"] == "counting": + if "value" in kwargs: + if kwargs["value"].lower() == "clear": + del data['bot-data'][str(ctx.guild.id)]['count_log'] + await ctx.send(f"Бот теперь не следит за счётом в этом канале") + else: + try: + data['bot-data'][str(ctx.guild.id)]['count_log'] = int(kwargs['value']) + await ctx.send(f"Канал {utils.get(ctx.guild.channels, id=data['bot-data'][str(ctx.guild.id)]['count_log'])} будет использоваться для счёта\nСледующее число: {data['bot-data'][str(ctx.guild.id)]['count_channel']}") + except Exception as e: + await ctx.send(f"Некорректное значение\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("count_log"): + await ctx.send(f"Канал для счёта не установлен.\nЧтобы включить, напишите id канала для админ-лога в аргументе *value*") + else: + await ctx.send(f"Канал для счёта: \"{utils.get(ctx.guild.channels, id=data['bot-data'][str(ctx.guild.id)]['count_log'])}\"\nЧтобы изменить канал для админ-лога, напишите его id в аргументе *value*\nЧтобы выключить админ-лог, в аргументе *value* напишите \"clear\"") + elif kwargs["setting"] == "roles_for_count": + if not data['bot-data'][str(ctx.guild.id)].get("count_log"): + await ctx.send("Канал для счёта не установлен.\nИспользуйте `/settings setting:Канал для счёта` чтобы узнать подробнее") + elif "value" in kwargs: + lst = kwargs["value"].split(" ") + try: + for l in lst: + int(l) + data['bot-data'][str(ctx.guild.id)]['roles'] = lst + answer = "Новый порядок ролей:" + for role in data['bot-data'][str(ctx.guild.id)]['roles']: + answer += f" <@&{role}>" + await ctx.send(answer) + except Exception as e: + await ctx.send(f"Ошибка\n\n`{e}`", delete_after=10) + else: + if not data['bot-data'][str(ctx.guild.id)].get("active_roles"): + await ctx.send("Роли для канала счёта не установлны\nЧтобы это сделать, напишите в аргументе *value* id ролей по порядку за число 100, 500, круглое число с 3 нолями на конце и круглое число с 4 нолями на конце") + else: + answer = "Требуемый актив за роли:" + for role in data['bot-data'][str(ctx.guild.id)]['active_roles']: + answer += f" {role}" + answer +="\nЧтобы изменить, напишите в аргументе *value* id ролей по порядку за число 100, 500, круглое число с 3 нолями на конце и круглое число с 4 нолями на конце\nЛибо после аргумента напишите \"clear\"" + await ctx.send(answer) + else: + await ctx.send("Вам нельзя использовать эту команду", delete_after=10) + + +@slash.slash(name="mute", description="Лишить кого-нибудь права отправлять сообщения на определённый срок", options=[ + create_option(name="user", description="Пользователь, в отношении которого будет применена санкция", option_type=6, required=True), + create_option(name="term", description="Либо срок в формате [s, m, h, d, w], либо дата в формате DD.MM.YYYY", option_type=3, required=True), + create_option(name="reason", description="Причина приминения санкции", option_type=3, required=False) +]) +async def mute(ctx, **kwargs): + if not can_use_it(ctx.author, ctx.guild.id): + await ctx.send("Вам нельзя использовать эту команду", delete_after=10) + return + if not data['bot-data'][str(ctx.guild.id)].get("mute_role"): + await ctx.send("Команда отключена", delete_after=10) + return + try: + if re.search(r"\d\d\.\d\d.\d\d\d\d", kwargs["term"]) and datetime.datetime.strptime(kwargs["term"], "%d.%m.%Y") >= datetime.datetime.utcnow(): + mute_time = datetime.datetime.strptime(kwargs["term"], "%d.%m.%Y") + elif ( + kwargs["term"][-1:] in ["s", "m", "h", "d", "w"] + and int(kwargs["term"][:-1]) > 0 + ): + valve_time_ban = int(kwargs["term"][:-1]) + type_time_ban = kwargs["term"][-1:] + now = datetime.datetime.utcnow() + if type_time_ban == "s": + mute = datetime.timedelta(seconds=valve_time_ban) + elif type_time_ban == "m": + mute = datetime.timedelta(minutes=valve_time_ban) + elif type_time_ban == "h": + mute = datetime.timedelta(hours=valve_time_ban) + elif type_time_ban == "d": + mute = datetime.timedelta(days=valve_time_ban) + elif type_time_ban == "w": + mute = datetime.timedelta(weeks=valve_time_ban) + mute_time = now + mute + else: + await ctx.send(f"Неправильное значения аргумента `term`: `{kwargs['term']}`", delete_after=10) + return + reason = kwargs["reason"] if "reason" in kwargs else "Не указана" + for_ban = kwargs["user"] + role = utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['mute_role']) + await for_ban.add_roles(role) + data['bot-data'][str(ctx.guild.id)]['muted'][str(for_ban.id)] = {"timestamp": mute_time.timestamp(), "reason": reason, "by_id": ctx.author.id, "done": datetime.datetime.utcnow().timestamp()} + emb = discord.Embed(description=f"От <@{ctx.author.id}> специально для <@{for_ban.id}>\n**Причина:** {reason}\n**Срок молчалки:** {strfdelta(now+mute, now, data['bot-data'][str(ctx.guild.id)]['days_in_timedelta'])}", title=f"Молчалка", timestamp=mute_time, colour=0x0000ff) + emb.set_author(name=f"{for_ban.name} (Ник: {for_ban.nick})", icon_url=for_ban.avatar_url) + emb.set_footer(text="Действует до") + await ctx.send(embed=emb) + except Exception as e: + await ctx.send(f"Я сломался: `{e}`", delete_after=10) + + +@slash.slash(name="ban", description="Лишить кого-нибудь права быть на этом сервере на определённый срок", options=[ + create_option(name="user", description="Пользователь, в отношении которого будет применена санкция", option_type=6, required=True), + create_option(name="term", description="Либо срок в формате [s, m, h, d, w], либо дата в формате DD.MM.YYYY", option_type=3, required=True), + create_option(name="reason", description="Причина приминения санкции", option_type=3, required=False) +]) +async def ban(ctx, **kwargs): + if not can_use_it(ctx.author, ctx.guild.id): + await ctx.send("Вам нельзя использовать эту команду", delete_after=10) + return + if not data['bot-data'][str(ctx.guild.id)]["can_ban"]: + await ctx.send("Команда отключена", delete_after=10) + return + try: + if re.search(r"\d\d\.\d\d.\d\d\d\d", kwargs["term"]) and datetime.datetime.strptime(kwargs["term"], "%d.%m.%Y") >= datetime.datetime.utcnow(): + mute_time = datetime.datetime.strptime(kwargs["term"], "%d.%m.%Y") + elif ( + kwargs["term"][-1:] in ["s", "m", "h", "d", "w"] + and int(kwargs["term"][:-1]) > 0 + ): + valve_time_ban = int(kwargs["term"][:-1]) + type_time_ban = kwargs["term"][-1:] + now = datetime.datetime.utcnow() + if type_time_ban == "s": + mute = datetime.timedelta(seconds=valve_time_ban) + elif type_time_ban == "m": + mute = datetime.timedelta(minutes=valve_time_ban) + elif type_time_ban == "h": + mute = datetime.timedelta(hours=valve_time_ban) + elif type_time_ban == "d": + mute = datetime.timedelta(days=valve_time_ban) + elif type_time_ban == "w": + mute = datetime.timedelta(weeks=valve_time_ban) + mute_time = now + mute + else: + await ctx.send(f"Неправильное значения аргумента `term`: `{kwargs['term']}`", delete_after=10) + return + reason = kwargs["reason"] if "reason" in kwargs else "Не указана" + for_ban = kwargs["user"] + await for_ban.ban(reason=reason) + data['bot-data'][str(ctx.guild.id)]['banned'][str(for_ban.id)] = {"timestamp": mute_time.timestamp(), "reason": reason, "by_id": ctx.author.id, "done": datetime.datetime.utcnow().timestamp()} + emb = discord.Embed(description=f"<@{ctx.author.id}> бьёт <@{for_ban.id}> банхаммером\n**Причина:** {reason}\n**Срок бана:** {strfdelta(now+mute, now, data['bot-data'][str(ctx.guild.id)]['days_in_timedelta'])}", title="Бан", timestamp=mute_time, colour=0x0000ff) + emb.set_author(name=f"{for_ban.name} (Ник: {for_ban.nick})", icon_url=for_ban.avatar_url) + emb.set_footer(text="Действует до") + await ctx.send(embed=emb) + except Exception as e: + await ctx.send(f"Я сломался: `{e}`", delete_after=10) + + +@slash.slash(name="unmute", description="Вернуть кому-нибудь право отправлять сообщения", options=[ + create_option(name="user", description="Пользователь, в отношении которого будет снята санкция", option_type=6, required=True) +]) +async def unmute(ctx, user): + if not can_use_it(ctx.author, ctx.guild.id): + await ctx.send("Вам нельзя использовать эту команду", delete_after=10) + return + if not data['bot-data'][str(ctx.guild.id)].get("mute_role"): + await ctx.send("Команда отключена", delete_after=10) + return + try: + for u in data['bot-data'][str(ctx.guild.id)]['muted']: + if int(u) == user.id: + role = utils.get(ctx.guild.roles, id=data['bot-data'][str(ctx.guild.id)]['mute_role']) + await user.remove_roles(role) + await ctx.send(f"Молчалка снята с {user.mention}") + del data['bot-data'][str(ctx.guild.id)]['muted'][u] + return + await ctx.send(f"У пользователя нет молчалки", delete_after=10) + except Exception as e: + await ctx.send(f"Я сломался: `{e}`", delete_after=10) + + +@slash.slash(name="unban", description="Вернуть кому-нибудь право быть на этом сервере", options=[ + create_option(name="userid", description="ID пользователя, в отношении которого будет снята санкция", option_type=4, required=True) +]) +async def unban(ctx, userID): + if not can_use_it(ctx.author, ctx.guild.id): + await ctx.send("Вам нельзя использовать эту команду", delete_after=10) + return + if not data['bot-data'][str(ctx.guild.id)]["can_ban"]: + await ctx.send("Команда отключена", delete_after=10) + return + try: + for_ban = str(userID) + for u in data['bot-data'][str(ctx.guild.id)]['banned']: + if u == for_ban: + ban_list = await ctx.guild.bans() + for i in ban_list: + if i.user.id == int(u): + unban = i.user + await ctx.guild.unban(unban) + await ctx.send(f"{unban} разбанен") + del data['bot-data'][str(ctx.guild.id)]['banned'][u] + return + await ctx.send("Пользователь не найден", delete_after=10) + except Exception as e: + await ctx.send(f"Я сломался: `{e}`", delete_after=10) + + +@slash.slash(name="mute_list", description="Посмотреть список активных на сервере молчалок") +async def mute_list(ctx): + if not can_use_it(ctx.author, ctx.guild.id): + await ctx.send("Вам нельзя использовать эту команду", delete_after=10) + return + if not data['bot-data'][str(ctx.guild.id)].get("mute_role"): + await ctx.send("Команда отключена", delete_after=10) + return + if len(data['bot-data'][str(ctx.guild.id)]['muted']) > 0: + desc_text = f"**Активных молчалок**: {len(data['bot-data'][str(ctx.guild.id)]['muted'])}" + if len(data['bot-data'][str(ctx.guild.id)]['muted']) > 25: + desc_text += f"\n**Embed может показать только 25 строк**" + emb = discord.Embed(title="Действующие молчалки", description=desc_text, color=0x0000ff) + for_cout = sorted(data['bot-data'][str(ctx.guild.id)]['muted'], key=lambda i:data['bot-data'][str(ctx.guild.id)]['muted'][i]["timestamp"]) + for u in for_cout: + unmute_time = datetime.datetime.fromtimestamp(data['bot-data'][str(ctx.guild.id)]['muted'][u]["timestamp"]) + mute_time = datetime.datetime.fromtimestamp(data['bot-data'][str(ctx.guild.id)]['muted'][u]["done"]) + strtimediff = strfdelta(unmute_time, datetime.datetime.utcnow(), data["bot-data"][str(ctx.guild.id)]["days_in_timedelta"]) + nick = ctx.guild.get_member(int(u)) + bnick = ctx.guild.get_member(int(data['bot-data'][str(ctx.guild.id)]['muted'][u]['by_id'])) + if nick is None: + try: + member = requests.get(f"https://discordapp.com/api/users/{u}", headers={'Authorization': f'Bot {data["main-data"]["token"]}'}).json() + nick = f"{member['username']}#{member['discriminator']}" + except: + nick = f"id{u}" + else: + nick = nick.display_name + if bnick is None: + try: + muted_by = requests.get(f"https://discordapp.com/api/users/{data['bot-data'][str(ctx.guild.id)]['muted'][u]['by_id']}", headers={'Authorization': f'Bot {data["main-data"]["token"]}'}).json() + bnick = f"{muted_by['username']}#{muted_by['discriminator']}" + except: + bnick = f"id{data['bot-data'][str(ctx.guild.id)]['muted'][u]['by_id']}" + else: + bnick = bnick.display_name + emb.add_field(name=nick, value=f"**От**: {mute_time.strftime('%d.%m.%Y %H:%M:%S UTC')}\n**До**: {unmute_time.strftime('%d.%m.%Y %H:%M:%S UTC')}\n**Ост. срок**: {strtimediff}\n**Причина**: {data['bot-data'][str(ctx.guild.id)]['muted'][u]['reason']}\n**Выдал**: {bnick}") + await ctx.send(embed=emb) + else: + await ctx.send("Нет действующих молчалок") + + +@slash.slash(name="ban_list", description="Посмотреть список активныx на сервере временных банов") +async def ban_list(ctx): + if not can_use_it(ctx.author, ctx.guild.id): + await ctx.send("Вам нельзя использовать эту команду", delete_after=10) + return + if not data['bot-data'][str(ctx.guild.id)]["can_ban"]: + await ctx.send("Команда отключена", delete_after=10) + return + if len(data['bot-data'][str(ctx.guild.id)]['banned']) > 0: + emb = discord.Embed(title="Действующие баны", description=f"**Активных банов**: {len(data['bot-data'][str(ctx.guild.id)]['banned'])}", color=0x0000ff) + for u in data['bot-data'][str(ctx.guild.id)]['banned']: + unmute_time = datetime.datetime.utcfromtimestamp(data['bot-data'][str(ctx.guild.id)]['banned'][u]["timestamp"]) + mute_time = datetime.datetime.fromtimestamp(data['bot-data'][str(ctx.guild.id)]['banned'][u]["done"]) + strtimediff = strfdelta(unmute_time, datetime.datetime.utcnow(), data["bot-data"][str(ctx.guild.id)]["days_in_timedelta"]) + nick = ctx.guild.get_member(int(u)) + bnick = ctx.guild.get_member(int(data['bot-data'][str(ctx.guild.id)]['banned'][u]['by_id'])) + if nick is None: + try: + member = requests.get(f"https://discordapp.com/api/users/{u}", headers={'Authorization': f'Bot {data["main-data"]["token"]}'}).json() + nick = f"{member['username']}#{member['discriminator']}" + except: + nick = f"id{u}" + else: + nick = nick.display_name + if bnick is None: + try: + muted_by = requests.get(f"https://discordapp.com/api/users/{data['bot-data'][str(ctx.guild.id)]['banned'][u]['by_id']}", headers={'Authorization': f'Bot {data["main-data"]["token"]}'}).json() + bnick = f"{muted_by['username']}#{muted_by['discriminator']}" + except: + bnick = f"id{data['bot-data'][str(ctx.guild.id)]['banned'][u]['by_id']}" + else: + bnick = bnick.display_name + emb.add_field(name=nick, value=f"**От**: {mute_time.strftime('%d.%m.%Y %H:%M:%S UTC')}\n**До**: {unmute_time.strftime('%d.%m.%Y %H:%M:%S UTC')}\n**Ост. срок**: {strtimediff}\n**Причина**: {data['bot-data'][str(ctx.guild.id)]['banned'][u]['reason']}\n**Выдал**: {bnick}") + await ctx.send(embed=emb) + else: + await ctx.send("Нет действующих банов") + + +async def time_unmute(member_id, guild_id): + response = requests.delete(f'https://discordapp.com/api/guilds/{guild_id}/members/{member_id}/roles/{data["bot-data"][guild_id]["mute_role"]}', headers={'Authorization': f'Bot {data["main-data"]["token"]}'}) + log(f"Discord API answer: {response.status_code} {response.reason}") + if response.ok and data['bot-data'][guild_id].get('notify_channel'): + await client.get_channel(data['bot-data'][guild_id]['notify_channel']).send(f"Молчалка снята с <@{member_id}>: Срок молчалки истёк") + +async def ny_notif(g): + await client.get_channel(data['bot-data'][g]['notify_channel']).send(f"Новый сюрприз готов. Жду того, кто готов его вручить (/gift)") + +async def time_unban(member_id, guild_id): + try: + ban_list = await client.get_guild(guild_id).bans() + for i in ban_list: + if i.user.id == int(member_id): + unban = i.user + await client.get_guild(int(guild_id)).unban(unban) + if data['bot-data'][guild_id].get('notify_channel'): + await client.get_channel(data['bot-data'][guild_id]['notify_channel']).send(f"{unban} разбанен: Срок бана истёк") + except: + member = requests.get(f"https://discordapp.com/api/users/{member_id}", headers={'Authorization': f'Bot {data["main-data"]["token"]}'}) + if member.ok: + member = member.json() + if data['bot-data'][guild_id].get('notify_channel'): + await client.get_channel(data['bot-data'][guild_id]['notify_channel']).send( + f"{member['username']}#{member['discriminator']} вычеркнут из бан-листа: срок бана истёк") + else: + if data['bot-data'][guild_id].get('notify_channel'): + await client.get_channel(data['bot-data'][guild_id]['notify_channel']).send(f"id{member_id} вычеркнут из бан-листа: срок бана истёк") + +vk = vk_api.VkApi(token="redacted") +vk_mda = vk_api.VkApi(token="redacted") +longpoll = VkBotLongPoll(vk, 190322075) +vkcall = vk.get_api() + +async def new_post(vk_event): + group = vkcall.groups.getById(group_id=str(vk_event.object.from_id)[1:], fields='photo_200') + emb = discord.Embed(description=vk_event.object.text, url=f"https://vk.com/{group[0]['screen_name']}?w=wall-{group[0]['id']}_{vk_event.object.id}", title="Вышел новый пост", timestamp=datetime.datetime.fromtimestamp(vk_event.object.date), colour=0xF0A020) + emb.set_author(name=group[0]['name'], url=f"https://vk.com/{group[0]['screen_name']}", icon_url=group[0]['photo_200']) + if vk_event.object.attachments: + photo = False + attachments = "" + for i in vk_event.object.attachments: + try: + if i['type'] == 'photo': + attachments += f"🖼 {i['type']}{i[i['type']]['owner_id']}_{i[i['type']]['id']}\n" + if not photo: + emb.set_image(url=i['photo']['sizes'][-1]['url']) + photo = True + elif i['type'] == 'wall': + attachments += f"📰 {i['type']}{i[i['type']]['from_id']}_{i[i['type']]['id']}\n" + elif i['type'] == 'link': + attachments += f"🔗 {i['type']} {i[i['type']]['title']}\n" + elif i['type'] == 'doc': + attachments += f"📄 {i['type']}{i[i['type']]['owner_id']}_{i[i['type']]['id']}\n" + elif i['type'] == 'poll': + attachments += f"📊 {i['type']}{i[i['type']]['owner_id']}_{i[i['type']]['id']}\n" + elif i['type'] == 'album': + attachments += f"🎨 {i['type']}{i[i['type']]['owner_id']}_{i[i['type']]['id']}\n" + elif i['type'] == 'video': + attachments += f"🎞 {i['type']}{i[i['type']]['owner_id']}_{i[i['type']]['id']}\n" + elif i['type'] == 'audio': + attachments += f"🎵 {i['type']}{i[i['type']]['owner_id']}_{i[i['type']]['id']}\n" + else: + attachments += f"🎩 {i['type']}{i[i['type']]['owner_id']}_{i[i['type']]['id']}\n" + except: + attachments += f"🎩 {i['type']}\n" + emb.add_field(name="Прикреплено", value=attachments) + emb.set_footer(text=f"wall{str(vk_event.object['from_id'])}_{str(vk_event.object['id'])}") + await client.get_channel(747588017543446568).send(embed=emb) + +def send(to, message=None, attachment=None): + try: + random_id = random.randint(-9223372036854775808, + 9223372036854775807) + message = vk.method('messages.send', + {'peer_id': int(to), 'message': message, 'random_id': random_id, + 'attachment': attachment}) + counters.incriment("vk-s") + except Exception as e: + counters.incriment("e") + logging.error(f'Failed to send VK message: {str(e)}') + +def vk_longpull(): + for event in MyVkLongPoll.listen(longpoll): + try: + if event.type == VkBotEventType.MESSAGE_NEW: + counters.incriment("vk-r") + if event.message.text.lower() == "бот дай денег": + send(event.message.peer_id, "Иди нахуй") + if event.message.text.lower() == "бот дай денег": + send(event.message.peer_id, "Иди нахуй") + if event.message.text.lower() == "бот дай": + send(event.message.peer_id, "Мне денег") + if event.message.text.lower() == "бот иди": + send(event.message.peer_id, "Ты нахуй") + if event.message.text.lower() == "бот нахуй": + send(event.message.peer_id, "Ты иди") + if event.message.text.lower() == "бот деньги": + send(event.message.peer_id, "Мне дай") + if event.message.text.lower() == "бот иди нахуй": + from_obj = vk.method("users.get", {'user_ids': event.message.from_id}) + send(event.message.peer_id, f"{from_obj[0]['first_name']}, дай денег") + if event.message.text == "!debug" and event.message.from_id == 276193568: + send(event.message.peer_id, debug()) + elif event.type == VkBotEventType.WALL_POST_NEW: + if event.object.post_type == "post": + log(f"New post! id{event.object['id']}") + post = f"wall{str(event.object['from_id'])}_{str(event.object['id'])}" + send(2000000003, f"Вышел новый пост", post) + coro = new_post(event) + fut = asyncio.run_coroutine_threadsafe(coro, client.loop) + try: + fut.result() + except: + counters.incriment("e") + continue + except Exception as kek: + log(f"Беды с ботом: {str(kek)}") + continue + +def bot_status(): + while True: + try: + time.sleep(1) + l = round(client.latency*1000) + up = strfdelta(datetime.datetime.utcnow(), START_TIME, False, "%Hч%Mм") + asyncio.run_coroutine_threadsafe(client.change_presence(activity=discord.Game(name=f"{num4(ACTIVE_TOTAL)} актива на {len(client.guilds)} серверах (пинг {l} мс, проработал {up})")), client.loop).result() + if datetime.datetime.utcnow().second == 0: + vk_widget = {"title": "Discord бот dan63047Bot#0924", + "title_counter": ACTIVE_TOTAL, + "text": widget_temp(data['main-data']['vk_widget_text']), + "descr": f"Обслуживает серверов: {len(client.guilds)}\nАптайм: {up}\nПинг до Discord API: {l} мс."} + vk_mda.method("appWidgets.update", {"type": "text", "code": f'return {json.dumps(vk_widget, ensure_ascii=False)};'}) + global NEW_YEAR_NOTIFYED + global NEW_YEAR_STATS + for g in NEW_YEAR_NOTIFYED: + if NEW_YEAR_NOTIFYED[g] is False and datetime.datetime.utcnow().timestamp() >= NEW_YEAR_STATS[g]["cooldown"]: + # coro = ny_notif(g) + # fut = asyncio.run_coroutine_threadsafe(coro, client.loop) + try: + # fut.result() + NEW_YEAR_NOTIFYED[g] = True + except: + counters.incriment("e") + continue + except Exception as e: + logging.error(f"Some activity tread shit {e}") + time.sleep(1) + continue + counters.incriment_uptime() + +def bot_bans(): + while True: + try: + time.sleep(1) + now = datetime.datetime.utcnow() + for g in data['bot-data']: + if g != "counters" and g != "new_year_event": + for b in data['bot-data'][g]['banned']: + if data['bot-data'][g]['banned'][b]['timestamp'] < now.timestamp(): + try: + asyncio.run_coroutine_threadsafe(time_unban(b, g), client.loop).result() + del data['bot-data'][g]['banned'][b] + except: + log("Time unban shit") + except: + logging.error("Some unban tread shit") + time.sleep(1) + continue + +def bot_muts(): + while True: + try: + time.sleep(1) + now = datetime.datetime.utcnow() + for g in data['bot-data']: + if g != "counters" and g != "new_year_event": + for m in data['bot-data'][g]['muted']: + if data['bot-data'][g]['muted'][m]['timestamp'] < now.timestamp(): + try: + asyncio.run_coroutine_threadsafe(time_unmute(m, g), client.loop).result() + del data['bot-data'][g]['muted'][m] + except: + log("Time unmute shit") + except: + logging.error("Some unmute tread shit") + time.sleep(1) + continue + +try: + threading.Thread(target=vk_longpull, name=vk_longpull, daemon=True).start() + threading.Thread(target=bot_status, name=bot_status, daemon=True).start() + threading.Thread(target=bot_bans, name=bot_bans, daemon=True).start() + threading.Thread(target=bot_muts, name=bot_muts, daemon=True).start() + client.run(data['main-data']['token']) +finally: + with open("data.json", "w") as jsn: + json.dump(data, jsn) + up = strfdelta(datetime.datetime.utcnow(), START_TIME, True, "%D:%H:%M:%S") + log(f"Data saved, script ended, uptime: {up}") \ No newline at end of file diff --git a/midnight.py b/midnight.py new file mode 100644 index 0000000..f9f954f --- /dev/null +++ b/midnight.py @@ -0,0 +1,228 @@ +import datetime +import config +import aprint +import json +import requests +import random +from urllib.request import urlopen + +aprint.info("Script started") + +try: + fwords = json.loads(open("fword.json", "r").read()) +except: + fwords = {"vk_fwords": {}, "ds_fwords": {}, "vk_last_fword": 0, "ds_last_fword": 0, "created": datetime.datetime.utcnow().timestamp()} + +ds_delete_fword = requests.delete(f"https://discordapp.com/api/guilds/{config.DISCORD_GUILD}/members/{fwords['ds_last_fword']}/roles/{config.DISCORD_ROLE_fword}", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}) +if ds_delete_fword.ok: + aprint.info(f"Discord remove role: {ds_delete_fword.status_code} {ds_delete_fword.reason}") +else: + aprint.error(f"Discord remove role: {ds_delete_fword.status_code} {ds_delete_fword.reason}") + +midnight_text = ["Миднайт!", + "Полночь!", + "Midnight!", + "миднигхт", + "Середина ночи", + "Смена даты!", + "00:00", + "Пора ложиться спать!", + "12 ночи", + "Медьникель!", + "Мёднугхт!", + "Ночное рандеву", + "Опівночі!", + "Арабская ночь", + "Конец смены"] +role_names = ["F-word дня", + "Лох дня", + "Приговорить к расстрелу", + "Малолетний дебил", + "Он отправится в Бразилию", + "Пропустил много стрелок пока битбоксил с пикой точеной", + "В дурку отправляется", + "Поставил крейзифрог на рингтон", + "Попросил наступить на себя еще раз", + "ААХАААА ОН ДОЛБОЁБ ПОСМОТРИТЕ НА НЕГООО!!", + "парннь ты долбоёб", + "Быдло дня", + "Фоткаю лучшего подписчика. Улыбнись", + "Восхваляет солнце"] + +imgvkrequest = requests.post("https://api.vk.com/method/photos.get", data={'owner_id': "-" + str(config.VK_GROUP_ID), + 'album_id': config.VK_ALBUM_MIDNIGHT_ID, + 'count': 1000, + 'access_token': config.VK_SERVICE_TOKEN, + 'v': '5.124'}) +if imgvkrequest.ok: + try: + random_images_query = json.loads(imgvkrequest.text) + random_number = random.randint(0, random_images_query['response']['count']-1) + aprint.info(f"VK method 'photos.get': {imgvkrequest.status_code} {imgvkrequest.reason}, returned photos: {random_images_query['response']['count']}, selected: {random_number}") + image = random_images_query['response']['items'][random_number] + image_request = urlopen(image["sizes"][-1]['url']).read() + image_file = open("md.jpg", "wb") + image_file.write(image_request) + image_file.close() + MIDNIGHT_IMAGE = True + except Exception as e: + MIDNIGHT_IMAGE = False + aprint.error(f"Error while getting image: {str(e)}") +else: + MIDNIGHT_IMAGE = False + aprint.error(f"VK method 'photos.get': {imgvkrequest.status_code} {imgvkrequest.reason}") +selected = random.choice(midnight_text) +now = datetime.datetime.utcnow() +new_date = now + datetime.timedelta(hours=3, minutes=3) +to_ny = datetime.datetime(year=2022, month=1, day=1) - now +if 30 >= to_ny.days > 1: + if MIDNIGHT_IMAGE: + text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nДо нового года осталось {to_ny.days} дн.\nКартинка дня:" + else: + text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nДо нового года осталось {to_ny.days} дн.\nОшибка при получении картинки дня" +elif to_ny.days == 1: + if MIDNIGHT_IMAGE: + text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nДо нового года осталось 24 часа.\nКартинка дня:" + else: + text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nДо нового года осталось 24 часа.\nОшибка при получении картинки дня" +elif to_ny.days == 0: + if MIDNIGHT_IMAGE: + text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nC новым, 2022 годом!!!\nКартинка дня:" + else: + text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nC новым, 2022 годом!!!\nОшибка при получении картинки дня" +else: + if MIDNIGHT_IMAGE: + text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nКартинка дня:" + else: + text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\n\nОшибка при получении картинки дня" +aprint.info(f"All ready. Waiting...") + +MIDNIGHT = False +while not MIDNIGHT: + now = datetime.datetime.utcnow() + if now.hour == 21 and now.minute == 0 and now.second == 1: + aprint.info("Midnight") + if MIDNIGHT_IMAGE: + dcrequest = requests.post(f"https://discordapp.com/api/channels/{config.DISCORD_CHANNEL_ID}/messages", + headers={'Authorization': f'Bot {config.DISCORD_TOKEN}', + 'Content-Disposition': 'form-data; filename="md.jpg"'}, + data={'payload_json': json.dumps({'content': text}), }, + files={'file': open("md.jpg", 'rb')}) + vkrequest = requests.post("https://api.vk.com/method/messages.send", + data={'peer_id': int(config.VK_DIALOG_ID), 'message': text, + 'random_id': random.randint(-9223372036854775808, 9223372036854775807), + 'attachment': f"photo{image['owner_id']}_{image['id']}", + 'access_token': config.VK_TOKEN, 'v': '5.124'}) + else: + dcrequest = requests.post(f"https://discordapp.com/api/channels/{config.DISCORD_CHANNEL_ID}/messages", + headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}, + data={'payload_json': json.dumps({'content': text}), }) + vkrequest = requests.post("https://api.vk.com/method/messages.send", + data={'peer_id': int(config.VK_DIALOG_ID), 'message': text, + 'random_id': random.randint(-9223372036854775808, 9223372036854775807), + 'access_token': config.VK_TOKEN, 'v': '5.124'}) + if dcrequest.ok: + aprint.info(f"Message to Discord: {dcrequest.status_code} {dcrequest.reason}") + else: + aprint.error(f"Message to Discord: {dcrequest.status_code} {dcrequest.reason}") + if vkrequest.ok: + aprint.info(f"Message to VK: {vkrequest.status_code} {vkrequest.reason}") + else: + aprint.error(f"Message to VK: {vkrequest.status_code} {vkrequest.reason}") + vk_users_request = requests.post("https://api.vk.com/method/messages.getConversationMembers", + data={'peer_id': config.VK_DIALOG_ID, 'fields': config.VK_ALBUM_MIDNIGHT_ID, + 'group_id': config.VK_GROUP_ID, 'access_token': config.VK_TOKEN, + 'v': '5.124'}) + if vk_users_request.ok: + aprint.info(f"VK method 'messages.getConversationMembers': {vk_users_request.status_code} {vk_users_request.reason}") + random_members_query = json.loads(vk_users_request.text) + if not fwords.get('vk_fword_story_3'): + fwords['vk_fword_story_3'] = 0 + if not fwords.get('vk_fword_story_2'): + fwords['vk_fword_story_2'] = 0 + if not fwords.get('vk_fword_story_1'): + fwords['vk_fword_story_1'] = 0 + new_vk_fword = False + while not new_vk_fword: + random_member = random.choice(random_members_query['response']['profiles']) + black_list = [292394871, 32272927] + white_list = [260168666] + debug_text = f"VK random person: {random_member['first_name']} {random_member['last_name']} - " + if (random_member['id'] != fwords['vk_last_fword'] and random_member['id'] != fwords['vk_fword_story_1'] and random_member['id'] != fwords['vk_fword_story_2'] and random_member['id'] != fwords['vk_fword_story_3'] and random_member['id'] not in white_list) or random_member['id'] in black_list: + aprint.debug(debug_text + "selected") + fwords['vk_fword_story_3'] = fwords['vk_fword_story_2'] + fwords['vk_fword_story_2'] = fwords['vk_fword_story_1'] + fwords['vk_fword_story_1'] = fwords['vk_last_fword'] + fwords['vk_last_fword'] = random_member['id'] + if str(random_member['id']) in fwords["vk_fwords"]: + fwords["vk_fwords"][str(random_member['id'])] += 1 + else: + fwords["vk_fwords"][str(random_member['id'])] = 1 + text = f"{random.choice(role_names)}: @id{random_member['id']} ({random_member['first_name']} {random_member['last_name']})" + vkrequest = requests.post("https://api.vk.com/method/messages.send", + data={'peer_id': config.VK_DIALOG_ID, 'message': text, + 'random_id': random.randint(-9223372036854775808, 9223372036854775807), + 'access_token': config.VK_TOKEN, 'v': '5.124'}) + new_vk_fword = True + if vkrequest.ok: + aprint.info(f"Message to VK: {vkrequest.status_code} {vkrequest.reason}") + else: + aprint.error(f"Message to VK: {vkrequest.status_code} {vkrequest.reason}") + else: + aprint.debug(debug_text + "not selected") + else: + aprint.error(f"VK method 'messages.getConversationMembers': {vk_users_request.status_code} {vk_users_request.reason}") + ds_members_r = requests.get(f"https://discordapp.com/api/guilds/{config.DISCORD_GUILD}/members?limit=1000", + headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}) + if ds_members_r.ok: + aprint.info(f"Discord guild member list request: {ds_members_r.status_code} {ds_members_r.reason}") + ds_members = json.loads(ds_members_r.text) + if not fwords.get('ds_fword_story_3'): + fwords['ds_fword_story_3'] = 0 + if not fwords.get('ds_fword_story_2'): + fwords['ds_fword_story_2'] = 0 + if not fwords.get('ds_fword_story_1'): + fwords['ds_fword_story_1'] = 0 + new_ds_fword = False + black_list = [235010902640820225, 611931400094089269] + white_list = [324555734115418112] + while not new_ds_fword: + member_fword = random.choice(ds_members) + debug_text = f"DS random person: {member_fword['user']['username']}#{member_fword['user']['discriminator']} - " + if (member_fword['user']['id'] != fwords['ds_last_fword'] and member_fword['user']['id'] != fwords['ds_fword_story_1'] and member_fword['user']['id'] != fwords['ds_fword_story_2'] and member_fword['user']['id'] != fwords['ds_fword_story_3'] and member_fword['user']['id'] not in white_list) or member_fword['user']['id'] in black_list: + aprint.debug(debug_text + "selected") + fwords['ds_fword_story_3'] = fwords['ds_fword_story_2'] + fwords['ds_fword_story_2'] = fwords['ds_fword_story_1'] + fwords['ds_fword_story_1'] = fwords["ds_last_fword"] + fwords["ds_last_fword"] = member_fword['user']['id'] + new_ds_fword = True + random_role = random.choice(role_names) + ds_req_rename_role = requests.patch(f"https://discordapp.com/api/guilds/{config.DISCORD_GUILD}/roles/{config.DISCORD_ROLE_fword}", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}, json={'name': random_role, 'color':random.randint(0x000000, 0xffffff)}) + if ds_req_rename_role.ok: + aprint.info(f"Discord rename role: {ds_req_rename_role.status_code} {ds_req_rename_role.reason}") + else: + aprint.error(f"Discord rename role: {ds_req_rename_role.status_code} {ds_req_rename_role.reason}") + text = f"{random_role}: <@{member_fword['user']['id']}>" + ds_send_message_r = requests.post(f"https://discordapp.com/api/channels/{config.DISCORD_CHANNEL_ID}/messages", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}, data={'payload_json': json.dumps({'content': text})}) + if ds_send_message_r.ok: + aprint.info(f"Message to Discord: {dcrequest.status_code} {dcrequest.reason}") + else: + aprint.error(f"Message to Discord: {dcrequest.status_code} {dcrequest.reason}") + ds_set_fword = requests.put(f"https://discordapp.com/api/guilds/{config.DISCORD_GUILD}/members/{member_fword['user']['id']}/roles/{config.DISCORD_ROLE_fword}", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}) + if ds_set_fword.ok: + aprint.info(f"Discord set role: {ds_set_fword.status_code} {ds_set_fword.reason}") + else: + aprint.error(f"Discord set role: {ds_set_fword.status_code} {ds_set_fword.reason}") + if str(member_fword['user']['id']) in fwords['ds_fwords']: + fwords['ds_fwords'][str(member_fword['user']['id'])] += 1 + else: + fwords['ds_fwords'][str(member_fword['user']['id'])] = 1 + else: + aprint.debug(debug_text + "not selected") + else: + aprint.error(f"Discord guild member list request: {ds_members_r.status_code} {ds_members_r.reason}") + with open("fword.json", "w") as jsn: + json.dump(fwords, jsn) + MIDNIGHT = True + +aprint.info("Done") diff --git a/stats.png b/stats.png new file mode 100644 index 0000000000000000000000000000000000000000..effdcc631a90327f0af5871315aa850ba80a8b82 GIT binary patch literal 59134 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 literal 0 HcmV?d00001 diff --git a/stats_all.png b/stats_all.png new file mode 100644 index 0000000000000000000000000000000000000000..8702529766354a520133d40dfc0ced668363476e GIT binary patch literal 12554 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 z zOfByOEeE-5T93xo{aPt;Eg>cb7*yIihxn{ww`#4H=^~3{18FQQES#f~5*8jV={$?u zVP|FaDk9=|@+C36qN}4rFXe>-f!To;<<%;ZDZqr1A;DUpBqNKBkJotm^!MeS%t@@IO6x#7$MuO9(x7<$-{SCxs0 z$(cM#a`aEB!vU%eEE%-uNQFIkfm9x--AW|4c8M8~Ksy&m7=a%M>2f1vLR|kV%nNJa z?6D~i2nhJ|=MP*=A|=w|@V^k1WV+IsvMK*rR+cKTYH~vOKWbuZY}~Va8KK(#Q7u!8 zHs;Otxf+o81^Tt|*$`1%?tV=H>F+QqX1&9y#wz%1@-s+iUG~pX64g3WE%dN>i>QBa zk4hxcJm{5b927VS2_I^)3lvs&GP`zbw8F+5M!GWhEG%}LX1La(fG$p1fA^4YGTnadkKq*1EXsl^b2(X4AgTs{FNJ&94 zl&`(5ucoX_X#06!pc3pO=x=}wLY6>!A%g&TlXy0X=)fZ)q8z!vC>tt)#|STjVe-Mc zv{EnoYyk`m4B*O)f#l@meZPNSMG8?9I({cYyuYbiW(8Rkg%*(Xuv;o=ckD}x;?C88 z8j5#=KJMaTipKgMFx>X|jDOz>87h$rK%G>CQurzft76>b1UcDRRHlS@PNV{lCg@eE z8X5ch`|mamLzE%Xu81c`9T9vB4iOCv%~1Bv*Pf*4VwHfm8<8r78g{`MKYuFK8^9AD zka#&-W+fGvmv9kZ$l|?1psc{N0;x`4(AtXxv1Ni;SHrLMRwo3J!zn(-XAfX^TM!|CH zY?O5TOBhbo>VC5P{QMl0Jn8Zq)trA5kOtpLol(1G$jnIaTRwg?a+lkF%l`6NrnN27c^sK1XR67o1&zIVnJ0+ z&F=a{8p&e=18}f3baWoBYw7FhG5@-B0rBjLq2UCuEm9;k4Go~3S?TRs1O%~*J6?>+ z_le~|*1?Ez*VI%~>xM&HKps7}sKp8Hi;9X$Ac=%=dUf>yyk2(Y+aluqOVfWKv)MvG z_X|=D^1;uyWE-a?{&zK48kCZf0to~RW!Cg919FNx5|;ic&={Z?a&vRH<~wG_wsFNJ zeiS@g;MyPs>fZInx_lT2!Mkjre>Xqe)+JGRqbdtohW$`UkP5eplhbu!o46qp-ntE> z_SqPM7_ddeI8@5DhmDk$mX?B|+`9MH8b_8MPLzrr=cqVA-34&hP-cLvf3~)62F}jU z8`QdWSR53aw${|vk|A|;bpfk6izwJ*tAWh}Qo}<5cX5FLRt8c_2(Uy(wxIv9Imk<; zVOM1S1E`Moo{iXJFPI6`pyOasz+6#xHE?zibO8nT@#F$Y&Qv8BTZhR`jDl?~Yb*sS zQ&kGAia{FF%2rk%pkW(J;h=~)mb zw$?pli2grx<93YNbR87(lA@4SSHHhZ-s&7b74=5O^KrKCXbaXuY!I0EM zANDFkHU*hTpK|QFjFPCyw>eXinRbX-g}8{COS{InX9)YX>|$oO2aw%xDqeVIA;s6cFgx1