Add mute, background unmute and unban tasks

This commit is contained in:
Zeva Rose 2021-07-01 12:26:03 -06:00
parent a59976544f
commit 825b291ee9
4 changed files with 160 additions and 3 deletions

View file

@ -1,11 +1,15 @@
from pathlib import Path from pathlib import Path
import pymongo
from datetime import datetime, timedelta
from discord import Intents from discord import Intents
from discord.ext import commands from discord.ext import commands
from discord.utils import find from discord.ext.tasks import loop
from discord.utils import find, get
from discord_slash import SlashCommand from discord_slash import SlashCommand
from psutil import Process from psutil import Process
import asyncio import asyncio
from jarvis.config import get_config from jarvis.config import get_config
from jarvis.utils.db import DBManager
from jarvis import utils, logo from jarvis import utils, logo
if asyncio.get_event_loop().is_closed(): if asyncio.get_event_loop().is_closed():
@ -61,6 +65,60 @@ async def on_guild_join(guild):
await general.send("Systems are now fully operational") await general.send("Systems are now fully operational")
@loop(minutes=1)
async def unmute():
db = DBManager(get_config().mongo).mongo
mutes = list(db.jarvis.mutes.find({"active": True}))
mute_roles = list(
db.jarvis.settings.find({"setting": "mute"}).sort[
("guild", pymongo.ASCENDING)
]
)
updates = []
for mute in mutes:
if mute["time"] + timedelta(minutes=mute["length"]) < datetime.now():
mute_role = [
x["value"] for x in mute_roles if x["guild"] == mute["guild"]
]
guild = await jarvis.fetch_guild(mute["guild"])
role = guild.get_role(mute_role)
user = guild.get_member(mute["user"])
if user:
user.remove_roles(role, reason="No longer muted")
updates.append(
pymongo.UpdateOne(
{"user": user.id, "guild": guild.id, "time": mute["time"]},
{"$set": {"active": False}},
)
)
db.jarvis.mutes.update_many(updates)
@loop(minutes=30)
async def unban():
db = DBManager(get_config().mongo).mongo
bans = list(db.jarvis.bans.find({"active": True, "type": "temp"}))
updates = []
for ban in bans:
if ban["time"] + timedelta(days=ban["length"]) < datetime.now():
guild = await jarvis.fetch_guild(ban["guild"])
user = jarvis.fetch_user(ban["user"])
if user:
guild.unban(user)
updates.append(
pymongo.UpdateOne(
{
"user": user.id,
"guild": guild.id,
"time": ban["time"],
"type": "temp",
},
{"$set": {"active": False}},
)
)
db.jarvis.bans.update_many(updates)
def run(ctx=None): def run(ctx=None):
global restart_ctx global restart_ctx
if ctx: if ctx:
@ -74,6 +132,8 @@ def run(ctx=None):
config.client_id config.client_id
) )
) )
unmute.start()
unban.start()
jarvis.run(config.token, bot=True, reconnect=True) jarvis.run(config.token, bot=True, reconnect=True)
for cog in jarvis.cogs: for cog in jarvis.cogs:
session = getattr(cog, "_session", None) session = getattr(cog, "_session", None)

View file

@ -1,7 +1,8 @@
import jarvis import jarvis
from datetime import datetime from datetime import datetime
from discord import User from discord import User, Member
from discord.ext import commands from discord.ext import commands
from discord.utils import get
from discord_slash import cog_ext from discord_slash import cog_ext
from discord_slash.utils.manage_commands import create_option, create_choice from discord_slash.utils.manage_commands import create_option, create_choice
from jarvis.utils.db import DBManager from jarvis.utils.db import DBManager
@ -208,6 +209,57 @@ class AdminCog(commands.Cog):
await ctx.defer() await ctx.defer()
await self._purge(ctx, amount) await self._purge(ctx, amount)
@cog_ext.cog_slash(
name="mute",
description="Mute a user",
guild_ids=[578757004059738142],
options=[
create_option(
name="user",
description="User to mute",
option_type=6,
required=True,
),
create_option(
name="reason",
description="Reason for mute",
option_type=3,
required=True,
),
create_option(
name="length",
description="Mute length",
option_type=4,
required=False,
),
],
)
async def _mute(self, ctx, user: Member, reason: str, length: int = 30):
mute_setting = self.db.jarvis.settings.find_one(
{"guild": ctx.guild.id, "setting": "mute"}
)
if not mute_setting:
await ctx.send(
"Please configure a mute role with /settings mute <role> first"
)
return
role = get(ctx.guild.roles, id=mute_setting["value"])
user.add_roles(role, reason=reason)
if length < 0:
length = -1
self.db.jarvis.mutes.insert_one(
{
"user": user.id,
"reason": reason,
"admin": ctx.author.id,
"time": datetime.now(),
"guild": ctx.guild.id,
"length": length,
"active": True,
}
)
await ctx.send(f"{user.mention} has been muted.\nReason: {reason}")
def setup(bot): def setup(bot):
bot.add_cog(AdminCog(bot)) bot.add_cog(AdminCog(bot))

45
jarvis/cogs/settings.py Normal file
View file

@ -0,0 +1,45 @@
import discord
import jarvis
from discord import Role
from discord.ext import commands
from discord_slash import cog_ext
from discord_slash.utils.manage_commands import create_option
from jarvis.config import get_config, reload_config
from jarvis.utils import update, user_is_bot_admin, db
class SettingsCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
config = get_config()
self.db = db.DBManager(config.mongo).mongo
self.cache = {}
def update_settings(self, setting, value, guild):
settings = {"setting": setting, "value": value, "guild": guild}
updated = self.db.jarvis.settings.update_one(
{"settings": setting, "guild": guild},
{"$set": settings},
upsert=True,
)
return updated is not None
@cog_ext.cog_subcommand(
base="settings",
name="mute",
description="Set mute role",
options=[
create_option(
name="role",
description="Mute role",
option_type=8,
required=True,
)
],
)
@commands.has_permissions(mute_members=True)
async def _mute(self, ctx, role: Role):
await ctx.defer()
self.update_settings("mute", role.id, ctx.guild.id)
await ctx.send(f"Settings applied. New mute role is {role.name}")

View file

@ -28,7 +28,7 @@ jarvis:
admin: User ID, admin who muted user admin: User ID, admin who muted user
time: datetime time: datetime
guild: Guild ID guild: Guild ID
type: String ("voice" | "text" | "all"), mute type, default "all" #type: String ("voice" | "text" | "all"), mute type, default "all"
length: int, mute length in minutes, default 30, -1 for permanent length: int, mute length in minutes, default 30, -1 for permanent
active: boolean, if mute is active active: boolean, if mute is active