├── README.md ├── rewrite-disnake ├── bot.py └── cogs │ ├── events.py │ └── warns.py └── source code ├── bot.py └── cogs └── warn_system.py /README.md: -------------------------------------------------------------------------------- 1 | # Система предупреждений для сервера дискорд 2 | Исходный код с ролика [Система предупреждений | Discord Bot, Mongodb, Python](https://youtu.be/-hPVfjyDREA) \ 3 | В папке [rewrite-disnake](https://github.com/Fsoky/Warns-System-Discord-Bot-Python/tree/main/rewrite-disnake), вы сможете найти новый переписанный код. 4 | 5 | ### Библиотеки 📚 6 | В исходнике [source code](https://github.com/Fsoky/Warns-System-Discord-Bot-Python/tree/main/source%20code): \ 7 | `discord.py` `pymongo` 8 | 9 | В переписанной версии [rewrite-disnake](https://github.com/Fsoky/Warns-System-Discord-Bot-Python/tree/main/rewrite-disnake): \ 10 | `disnake` `motor` 11 | 12 | ### Рекомендации ✔ 13 | - Зарегистрироваться на сайте [MongoDB](https://www.mongodb.com/) 14 | - В случае ошибок/багов, отписать в группу [Вконтаке](https://vk.com/fsoky) 15 | -------------------------------------------------------------------------------- /rewrite-disnake/bot.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import disnake 4 | from disnake.ext import commands 5 | 6 | bot = commands.Bot(command_prefix=".", intents=disnake.Intents.all()) 7 | 8 | 9 | @bot.command() 10 | @commands.is_owner() 11 | async def load(ctx, extension): 12 | bot.load_extension(f"cogs.{extension}") 13 | 14 | 15 | @bot.command() 16 | @commands.is_owner() 17 | async def reload(ctx, extension): 18 | bot.reload_extension(f"cogs.{extension}") 19 | 20 | 21 | @bot.command() 22 | @commands.is_owner() 23 | async def unload(ctx, extension): 24 | bot.unload_extension(f"cogs.{extension}") 25 | 26 | 27 | for filename in os.listdir("./cogs"): 28 | if filename.endswith(".py"): 29 | bot.load_extension(f"cogs.{filename[:-3]}") 30 | 31 | bot.run("TOKEN") -------------------------------------------------------------------------------- /rewrite-disnake/cogs/events.py: -------------------------------------------------------------------------------- 1 | import disnake 2 | from disnake.ext import commands 3 | 4 | from motor.motor_asyncio import AsyncIOMotorClient 5 | 6 | 7 | class Events(commands.Cog): 8 | 9 | def __init__(self, bot): 10 | self.bot = bot 11 | 12 | self.cluster = AsyncIOMotorClient("LINK") 13 | self.collusers = self.cluster.DATABASE_NAME.COLLECTION_NAME 14 | self.collservers = self.cluster.DATABASE_NAME.COLLECTION_NAME 15 | 16 | @commands.Cog.listener() 17 | async def on_ready(self): 18 | for guild in self.bot.guilds: 19 | for member in guild.members: 20 | if await self.collusers.count_documents({"member_id": member.id, "guild_id": guild.id}) == 0: 21 | await self.collusers.insert_one( 22 | { 23 | "member_id": member.id, 24 | "guild_id": guild.id, 25 | "warns": 0, 26 | "reasons": [] 27 | } 28 | ) 29 | if await self.collservers.count_documents({"guild_id": guild.id}) == 0: 30 | await self.collservers.insert_one( 31 | { 32 | "guild_id": guild.id, 33 | "case": 0 34 | } 35 | ) 36 | 37 | @commands.Cog.listener() 38 | async def on_member_join(member): 39 | if await self.collusers.count_documents({"member_id": member.id, "guild_id": member.guild.id}) == 0: 40 | await self.collusers.insert_one( 41 | { 42 | "member_id": member.id, 43 | "guild_id": member.guild.id, 44 | "warns": 0, 45 | "reasons": [] 46 | } 47 | ) 48 | 49 | @commands.Cog.listener() 50 | async def on_guild_join(guild): 51 | if await self.collservers.count_documents({"guild_id": guild.id}) == 0: 52 | await self.collservers.insert_one( 53 | { 54 | "guild_id": guild.id, 55 | "case": 0 56 | } 57 | ) 58 | 59 | 60 | def setup(bot): 61 | bot.add_cog(Events(bot)) 62 | -------------------------------------------------------------------------------- /rewrite-disnake/cogs/warns.py: -------------------------------------------------------------------------------- 1 | import disnake 2 | from disnake.ext import commands 3 | 4 | from motor.motor_asyncio import AsyncIOMotorClient 5 | 6 | 7 | class WarnsSystem(commands.Cog): 8 | 9 | def __init__(self, bot): 10 | self.bot = bot 11 | 12 | self.cluster = AsyncIOMotorClient("LINK") 13 | self.collusers = self.cluster.DATABASE_NAME.COLLECTION_NAME 14 | self.collservers = self.cluster.DATABASE_NAME.COLLECTION_NAME 15 | 16 | @commands.command(name="warn") 17 | async def give_warn(self, ctx, member: disnake.Member, *, reason="Вы нарушили правила"): 18 | if await self.collusers.find_one({"member_id": member.id, "guild_id": ctx.guild.id})["warns"] >= 3: 19 | await self.collusers.update_one( 20 | { 21 | "member_id": member.id, 22 | "guild_id": ctx.guild.id 23 | }, 24 | { 25 | "$set": { 26 | "warns": 0, 27 | "reasons": [] 28 | } 29 | } 30 | ) 31 | 32 | role = disnake.utils.get(ctx.guild.roles, id=12345) # Pass role id here. 33 | await member.add_roles(role) 34 | else: 35 | await self.collservers.update_one( 36 | { 37 | "guild_id": ctx.guild.id 38 | }, 39 | { 40 | "$inc": { 41 | "case": 1 42 | } 43 | } 44 | ) 45 | await self.collusers.update_one( 46 | { 47 | "member_id": member.id, 48 | "guild_id": ctx.guild.id 49 | }, 50 | { 51 | "$inc": { 52 | "warns": 1 53 | }, 54 | "$push": { 55 | "reasons": { 56 | "author_id": ctx.author.id, 57 | "case": await self.collservers.find_one({"guild_id": ctx.guild.id})["case"], 58 | "reason": reason 59 | } 60 | } 61 | } 62 | ) 63 | 64 | await ctx.send(f"{ctx.author} выдал предупреждение {member} | Случай: {await self.collservers.find_one({'guild_id': ctx.guild.id}['case'])}") 65 | 66 | @commands.command(name="remwarn") 67 | async def remove_warn(self, ctx, case: int): 68 | values = {"reasons.case": case, "guild_id": ctx.guild.id} 69 | 70 | if await self.collusers.count_documents(values) == 0: 71 | await ctx.send("Такого случая не существует") 72 | else: 73 | await self.collusers.update_one(values, 74 | { 75 | "$inc": { 76 | "warns": -1 77 | }, 78 | "$pull": { 79 | "reasons": { 80 | "case": case 81 | } 82 | } 83 | } 84 | ) 85 | 86 | await ctx.message.add_reaction("💖") 87 | 88 | @commands.command(name="view") 89 | async def view_warns(self, ctx, member: disnake.Member=None): 90 | values = {"member_id": ctx.author.id, "guild_id": ctx.guild.id} 91 | if member is not None: 92 | values["member_id"] = member.id 93 | 94 | embed = disnake.Embed(title="Warns") 95 | usr = await self.collusers.find_one(values) 96 | 97 | for value in usr["reasons"]: 98 | embed.add_field( 99 | name=f"Author: {self.bot.get_user(value['author_id'])}", 100 | value=f"Case: {value['case']}\nReason: {value['reason']}", 101 | inline=False 102 | ) 103 | 104 | await ctx.send(embed=embed) 105 | 106 | 107 | def setup(bot): 108 | bot.add_cog(WarnsSystem(bot)) 109 | -------------------------------------------------------------------------------- /source code/bot.py: -------------------------------------------------------------------------------- 1 | import discord 2 | from discord.ext import commands 3 | from pymongo import MongoClient 4 | import os 5 | 6 | bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) 7 | cluster = MongoClient("mongodb+srv://:@cluster0.5hnrh.mongodb.net/warnsdb?retryWrites=true&w=majority") 8 | collusers = cluster.warnsdb.collusers 9 | collservers = cluster.warnsdb.collservers 10 | 11 | 12 | @bot.event 13 | async def on_ready(): 14 | for guild in bot.guilds: 15 | for member in guild.members: 16 | values = { 17 | "_id": member.id, 18 | "guild_id": guild.id, 19 | "warns": 0, 20 | "reasons": [] 21 | } 22 | server_values = { 23 | "_id": guild.id, 24 | "case": 0 25 | } 26 | 27 | if collusers.count_documents({"_id": member.id, "guild_id": guild.id}) == 0: 28 | collusers.insert_one(values) 29 | if collservers.count_documents({"_id": guild.id}) == 0: 30 | collservers.insert_one(server_values) 31 | 32 | 33 | @bot.event 34 | async def on_member_join(member): 35 | values = { 36 | "_id": member.id, 37 | "guild_id": guild.id, 38 | "warns": 0, 39 | "reasons": [] 40 | } 41 | 42 | if collusers.count_documents({"_id": member.id, "guild_id": guild.id}) == 0: 43 | collusers.insert_one(values) 44 | 45 | 46 | @bot.event 47 | async def on_guild_join(guild): 48 | server_values = { 49 | "_id": guild.id, 50 | "case": 0 51 | } 52 | 53 | if collservers.count_documents({"_id": guild.id}) == 0: 54 | collservers.insert_one(server_values) 55 | 56 | 57 | for filename in os.listdir("./cogs"): 58 | if filename.endswith(".py"): 59 | bot.load_extension(f"cogs.{filename[:-3]}") 60 | 61 | bot.run("token") -------------------------------------------------------------------------------- /source code/cogs/warn_system.py: -------------------------------------------------------------------------------- 1 | import discord 2 | from discord.ext import commands 3 | from pymongo import MongoClient 4 | 5 | 6 | class WarnSystem(commands.Cog): 7 | 8 | def __init__(self, bot): 9 | self.bot = bot 10 | self.cluster = MongoClient("mongodb+srv://:@cluster0.5hnrh.mongodb.net/warnsdb?retryWrites=true&w=majority") 11 | self.collusers = self.cluster.warnsdb.collusers 12 | self.collservers = self.cluster.warnsdb.collservers 13 | 14 | 15 | @commands.command(name="warn") 16 | async def give_warn(self, ctx, member: discord.Member, *, reason="You violated the rules."): 17 | if self.collusers.find_one({"_id": member.id, "guild_id": ctx.guild.id})["warns"] >= 3: 18 | self.collusers.update_one( 19 | { 20 | "_id": member.id, 21 | "guild_id": ctx.guild.id 22 | }, 23 | { 24 | "$set": { 25 | "warns": 0, 26 | "reasons": [] 27 | } 28 | } 29 | ) 30 | 31 | role = discord.utils.get(ctx.guild.roles, id=839052909714341918) 32 | await member.add_roles(role) 33 | else: 34 | self.collservers.update_one( 35 | { 36 | "_id": ctx.guild.id 37 | }, 38 | { 39 | "$inc": { 40 | "case": 1 41 | } 42 | } 43 | ) 44 | self.collusers.update_one( 45 | { 46 | "_id": member.id, 47 | "guild_id": ctx.guild.id 48 | }, 49 | { 50 | "$inc": { 51 | "warns": 1 52 | }, 53 | "$push": { 54 | "reasons": { 55 | "author_id": ctx.author.id, 56 | "case": self.collservers.find_one({"_id": ctx.guild.id})["case"], 57 | "reason": reason 58 | } 59 | } 60 | } 61 | ) 62 | 63 | await ctx.send(f"{ctx.author} gave warn to {member} | case: {self.collservers.find_one({'_id': ctx.guild.id})['case']}") 64 | 65 | 66 | @commands.command(name="remwarn") 67 | async def remove_warn(self, ctx, case: int): 68 | if self.collusers.count_documents({"reasons.case": case, "guild_id": ctx.guild.id}) == 0: 69 | await ctx.send("This case doesn't exist") 70 | else: 71 | self.collusers.update_one( 72 | { 73 | "reasons.case": case, 74 | "guild_id": ctx.guild.id 75 | }, 76 | { 77 | "$inc": { 78 | "warns": -1 79 | }, 80 | "$pull": { 81 | "reasons": { 82 | "case": case 83 | } 84 | } 85 | } 86 | ) 87 | 88 | await ctx.send("Success!") 89 | 90 | 91 | @commands.command(name="view") 92 | async def view_warns(self, ctx, member: discord.Member=None): 93 | usr = self.collusers.find_one({"_id": ctx.author.id, "guild_id": ctx.guild.id}) 94 | if member is not None: 95 | usr = self.collusers.find_one({"_id": member.id, "guild_id": ctx.guild.id}) 96 | 97 | embed = discord.Embed(title="Warns") 98 | for value in usr["reasons"]: 99 | embed.add_field( 100 | name=f"Author: {self.bot.get_user(value['author_id'])}", 101 | value=f"Case: {value['case']}\nReason: {value['reason']}", 102 | inline=False 103 | ) 104 | 105 | await ctx.send(embed=embed) 106 | 107 | 108 | def setup(bot): 109 | bot.add_cog(WarnSystem(bot)) --------------------------------------------------------------------------------