Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import configparser
- import discord
- from discord.ext import commands
- import cache
- import database
- import errors
- from reports import Reports
- config = configparser.ConfigParser()
- config.read("config.ini", encoding='utf-8')
- db = database.Database(
- host=config["DB"]["server"],
- user=config["DB"]["login"],
- database=config["DB"]["database"],
- password=config["DB"]["password"],
- port=config["DB"].getint("port")
- )
- cache = cache.Cache()
- auth_guilds = [560201762196422666, 489527439710617612] # сервера, на которые бот может зайти
- class ReportButtons(discord.ui.View):
- def __init__(self):
- super().__init__(timeout=None)
- @discord.ui.button(
- label="Закрыть",
- style=discord.ButtonStyle.danger,
- custom_id="sgb:report_close",
- emoji="❌"
- )
- async def close(self, button: discord.ui.Button, interaction: discord.Interaction):
- message = await interaction.response.send_message(f"Button clicked {button.custom_id}", ephemeral=True,
- delete_after=10)
- print(message)
- @discord.ui.button(
- label="Переназначить МД",
- style=discord.ButtonStyle.blurple,
- custom_id="sgb:report_reassign_moderator",
- emoji="🔨"
- )
- async def reassign_md(self, button: discord.ui.Button, interaction: discord.Interaction):
- message = await interaction.response.send_message(f"Button clicked {button.custom_id}", ephemeral=True,
- delete_after=10)
- print(message)
- @discord.ui.button(
- label="Закрыть успешно",
- style=discord.ButtonStyle.success,
- custom_id="sgb:report_close_successfully",
- emoji="✅"
- )
- async def close_success(self, button: discord.ui.Button, interaction: discord.Interaction):
- message = await interaction.response.send_message(f"Button clicked {button.custom_id}", ephemeral=True,
- delete_after=10)
- print(message)
- class Bot(commands.Bot):
- def __init__(self, ):
- super().__init__(command_prefix='some prefix', help_command=None,
- intents=discord.Intents(guilds=True, members=True, presences=True),
- message_commands=False, slash_commands=True, slash_command_guilds=[489527439710617612])
- self.persistent_views_added = False
- async def on_ready(self):
- if not self.persistent_views_added:
- self.add_view(ReportButtons())
- self.add_view(ModeratorsDropdown())
- bot = Bot()
- bot.add_cog(Reports(bot, cache, db, ReportButtons))
- @bot.event
- async def on_ready():
- cache.cache_data()
- # проверка серверов бота и выход из ненужных
- for guild in bot.guilds:
- if guild.id not in auth_guilds:
- await guild.leave()
- print(f"Bot start as {bot.user}")
- @bot.event
- async def on_guild_join(guild: discord.Guild):
- # выход из сервера, если его нет в списке
- if guild.id not in auth_guilds:
- await guild.leave()
- @bot.event
- async def on_command_error(ctx: commands.Context, exception: commands.CommandError):
- print(type(exception), exception)
- if isinstance(exception, errors.ReportAlreadyOpen):
- embed = discord.Embed(title="❌ У вас уже есть открытый репорт!",
- description="Нельзя иметь больше одного открытого репорта, дождитесь решения предыдущего")
- await ctx.send(embed=embed, ephemeral=True)
- elif isinstance(exception, commands.MissingPermissions):
- embed = discord.Embed(title="❌ У вас нет прав!",
- description="Вы не можете использовать эту команду, так как у вас нет прав")
- await ctx.send(embed=embed, ephemeral=True)
- @bot.command()
- @commands.has_permissions(administrator=True)
- async def settings(ctx: commands.Context, channels_category: discord.CategoryChannel, moderators_role: discord.Role,
- logs_channel: discord.TextChannel):
- """Установить категорию и роль модераторов"""
- server = cache.get_server(ctx.guild.id)
- webhook = await logs_channel.create_webhook(name="SG Bot logs")
- try:
- old_webhook = await bot.fetch_webhook(server.webhook_id)
- await old_webhook.delete(reason="Был выпущен новый")
- except discord.NotFound:
- print("webhook not found")
- server.webhook_id = webhook.id
- server.moderators_role_id = moderators_role.id
- server.channels_category_id = channels_category.id
- server.sync_data()
- embed = discord.Embed(title="Данные изменены ✅",
- description="Вы успешно изменили данные сервера.\nТеперь установлены следующие:")
- embed.add_field(name="ID категории", value=channels_category.id, inline=True)
- embed.add_field(name="ID роли модераторов", value=moderators_role.id, inline=True)
- embed.add_field(name="Webhook ID", value=webhook.id)
- await ctx.send(embed=embed, ephemeral=True)
- bot.run(config["Config"]["token"])
- ### reports.py
- import datetime
- import random
- from typing import Optional, Literal
- import discord
- from discord.ext import commands
- import errors
- from cache import Cache
- from database import Database
- class Reports(commands.Cog):
- def __init__(self, bot, cache, database, report_buttons):
- self.bot: commands.Bot = bot
- self.cache: Cache = cache
- self.db: Database = database
- self.report_buttons = report_buttons
- @commands.Cog.listener()
- async def on_guild_channel_delete(self, channel: discord.abc.GuildChannel):
- if channel.category_id != self.cache.get_server(channel.guild.id).channels_category_id:
- return
- report: Cache.Report = self.cache.get_report(channel_id=channel.id)
- if report is None:
- return
- report.status = "Closed: channel deleted"
- report.closing_time = datetime.datetime.now()
- report.closed_moderator_id = report.assigned_moderator_id # нельзя узнать кто удалил канал без лишних запросов
- report.sync_data()
- @commands.group(name="report")
- async def report(self, ctx):
- """report"""
- pass
- @report.command(name="member")
- async def report_member(
- self,
- ctx: commands.Context,
- member: discord.Member = commands.Option(description="Участник, на которого вы подаете жалобу"),
- title: str = commands.Option(description="Краткое описание ситуации", name="title"),
- description: str = commands.Option(description="Подробное описание ситуации", name="description"),
- rule: Optional[
- Literal[
- "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12", "1.13", "2.1", "2.2", "2.3", "2.4"]
- ] = commands.Option(description="Правило, которое нарушил пользователь"),
- proof: Optional[str] = commands.Option(
- description="Доказательство (картинка или другой файл). Вставьте прямую ссылку на файл")
- ):
- """Отправить жалобу на пользователя"""
- await self.create_report(ctx, "member", title, description, member, rule, proof)
- @report.command(name="other")
- async def report_other(
- self,
- ctx: commands.Context,
- title: str = commands.Option(description="Краткое описание ситуации", name="title"),
- description: str = commands.Option(description="Подробное описание ситуации", name="description"),
- rule: Optional[
- Literal[
- "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12", "1.13", "2.1", "2.2", "2.3", "2.4"]
- ] = commands.Option(description="Правило, которое нарушил пользователь"),
- proof: Optional[str] = commands.Option(
- description="Доказательство (картинка или другой файл). Вставьте прямую ссылку на файл")
- ):
- """Отправить жалобу по другой причине"""
- await self.create_report(ctx, "other", title, description, None, rule, proof)
- async def create_report(self, ctx: commands.Context, type: str, title: str, description: str,
- member: discord.Member = None,
- rule: str = None, proof: str = None):
- """The function that the /report commands use to create reports"""
- async def choice_moderator(excluded_member: discord.Member = None) -> discord.Member:
- moderators_role = ctx.guild.get_role(self.cache.get_server(ctx.guild.id).moderators_role_id)
- moderators = list()
- moderators_online = list()
- for moder in moderators_role.members:
- if excluded_member is not None:
- if moder.id is excluded_member.id:
- continue
- if moder.status is not discord.Status.offline:
- moderators_online.append(moder)
- moderators.append(moder)
- else:
- moderators.append(moder)
- if moderators_online:
- return random.choice(moderators_online)
- else:
- return random.choice(moderators)
- for report in self.cache.reports.values():
- if report.applicant_id == ctx.author.id and report.status == "Open":
- raise errors.ReportAlreadyOpen("You already have an open report #%s" % report.id)
- embed = discord.Embed(
- title=title,
- description=description,
- color=0xff9900,
- timestamp=datetime.datetime.now()
- )
- embed.set_author(name=ctx.author, icon_url=ctx.author.avatar.url)
- embed.set_footer(text=f"Тип обращения: {type}")
- embed.add_field(name='Истец', value=ctx.author.mention, inline=True)
- if member is not None:
- embed.add_field(name='Ответчик', value=member.mention, inline=True)
- moderator = await choice_moderator(member)
- embed.add_field(name="Назначенный модератор", value=moderator.mention, inline=True)
- if rule is not None:
- embed.add_field(name="Нарушенное правило", value=rule, inline=False)
- if proof is not None:
- embed.add_field(name="Доказательство", value=proof, inline=True)
- created_report = self.cache.add_report(
- applicant_id=ctx.author.id,
- respondent_id=member.id if member is not None else None,
- title=title,
- description=description,
- rule=rule,
- proof=proof,
- assigned_moderator_id=moderator.id,
- creation_time=datetime.datetime.now(),
- type=type,
- current_moderator_id=moderator.id
- )
- overwrites = {
- ctx.guild.default_role: discord.PermissionOverwrite(view_channel=False),
- ctx.author: discord.PermissionOverwrite(view_channel=True, send_messages=True, read_messages=True,
- attach_files=True),
- moderator: discord.PermissionOverwrite(view_channel=True, send_messages=True, read_messages=True,
- attach_files=True, manage_channels=True),
- }
- if member is not None:
- overwrites[member] = discord.PermissionOverwrite(view_channel=True, send_messages=True, read_messages=True,
- attach_files=True)
- channel = await ctx.guild.create_text_channel(
- name=f"Репорт №{created_report.id}",
- topic=description,
- category=ctx.guild.get_channel_or_thread(self.cache.get_server(ctx.guild.id).channels_category_id),
- reason=f"Report №{created_report.id}",
- overwrites=overwrites
- )
- created_report.change_data(channel_id=channel.id)
- message = await channel.send(
- f"Назначенные люди: {member.mention if member is not None else ''} {ctx.author.mention} {moderator.mention}",
- embed=embed, view=self.report_buttons())
- embed_success = discord.Embed(title="Репорт создан ✅",
- description="Ваш репорт создан и ждет рассмотрения модераторами. Вы можете перейти к нему по ссылкам ниже")
- embed_success.add_field(name="Канал", value=channel.mention)
- embed_success.add_field(name="Сообщение", value=f"[Ссылка на сообщение]({message.jump_url})")
- embed_success.set_footer(text="Powered by Shandy")
- embed_success.set_author(name=f"Номер обращения: {created_report.id}", url=message.jump_url)
- await ctx.send(embed=embed_success, ephemeral=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement