Skip to content
Snippets Groups Projects
Commit 30749e36 authored by LMzK's avatar LMzK
Browse files

Mute-Befehl

parent b4370bfa
Branches
No related tags found
1 merge request!10Erweiterungen
......@@ -12,6 +12,11 @@ DISCORD_BOTUEBUNGSPLATZ_CHANNEL=<ID of channel for bot experiments>
DISCORD_ROLLEN_CHANNEL=<ID of channel for attribution of server roles>
DISCORD_OFFTOPIC_CHANNEL=<ID of channel for greeting & everydays subjects and questions>
DISCORD_SUPPORT_CHANNEL=<ID of channel where modmail is forwarded>
DISCORD_CALMDOWN_ROLE=<ID of calmdown role>
# JSON Files
DISCORD_LINKS_FILE=<File name for links JSON file>
DISCORD_CALMDOWN_FILE=<File name for calmdowns JSON file>
# Misc
DISCORD_DATE_TIME_FORMAT=<Date and time format used for commands like %d.%m.%Y %H:%M>
\ No newline at end of file
import datetime
import json
import os
import re
import discord
from discord.ext import commands, tasks
import utils
from cogs.help import help
"""
DISCORD_CALMDOWN_ROLE - Die Rollen-ID der "Mute"-Rolle.
DISCORD_CALMDOWN_FILE - Datendatei. Wenn diese noch nicht existiert wird sie angelegt.
DISCORD_DATE_TIME_FORMAT - Datumsformat für die interne Speicherung.
"""
class Calmdown(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.role_id = int(os.getenv("DISCORD_CALMDOWN_ROLE"))
self.file = os.getenv("DISCORD_CALMDOWN_FILE")
self.fmt = os.getenv("DISCORD_DATE_TIME_FORMAT")
self.silenced_users = {}
self.load()
self.timer.start()
def load(self):
try:
file = open(self.file, mode='r')
self.silenced_users = json.load(file)
except FileNotFoundError:
pass
def save(self):
file = open(self.file, mode='w')
json.dump(self.silenced_users, file)
async def unsilence(self, user_id, guild_id, inform_user=False):
guild = await self.bot.fetch_guild(int(guild_id))
role = guild.get_role(self.role_id)
try:
user = await guild.fetch_member(int(user_id))
if inform_user:
await utils.send_dm(user, f"Die Mute-Rolle wurde dir nun wieder entnommen.")
await user.remove_roles(role)
except discord.errors.NotFound:
pass
if self.silenced_users.get(str(user_id)):
del self.silenced_users[str(user_id)]
self.save()
@tasks.loop(minutes=1)
async def timer(self):
now = datetime.datetime.now()
silenced_users = self.silenced_users.copy()
for user_id, data in silenced_users.items():
duration = data.get('duration')
if not duration:
return
till = datetime.datetime.strptime(duration, self.fmt)
if now >= till:
await self.unsilence(user_id, data['guild_id'], inform_user=True)
@help(
brief="Weist einem User die Calmdown-Rolle zu.",
example="!mute @user 1d",
parameters={
"user": "Mention des Users, der eine Auszeit benötigt",
"duration": "Länge der Auszeit (24h für 24 Stunden 7d für 7 Tage oder 10m oder 10 für 10 Minuten. 0 hebt die Sperre auf).",
},
description="In der Auszeit darf das Servermitglied noch alle Kanäle lesen. Das Schreiben und Sprechen ist für ihn oder sie allerdings bis zum Ablauf der Zeit gesperrt.",
mod=True
)
@commands.command(name="calmdown", aliases=["auszeit", "mute"])
@commands.check(utils.is_mod)
async def cmd_calmdown(self, ctx, user: discord.Member, duration):
if re.match(r"^[0-9]+$", duration):
duration = f"{duration}m"
if not utils.is_valid_time(duration):
await ctx.channel.send("Fehler! Wiederholung in ungültigem Format!")
return
else:
guild = ctx.guild
role = guild.get_role(self.role_id)
if not role:
ctx.channel.send("Fehler! Rolle nicht vorhanden!")
return
duration = utils.to_minutes(duration)
if duration == 0:
await ctx.channel.send(f"{ctx.author.mention} hat {user.mention} von der **Auszeit** geholt.")
await self.unsilence(user.id, guild.id, inform_user=False)
return
now = datetime.datetime.now()
till = now + datetime.timedelta(minutes=duration)
self.silenced_users[str(user.id)] = {"duration": till.strftime(self.fmt), "guild_id": guild.id}
self.save()
await ctx.channel.send(f"{ctx.author.mention} hat {user.mention} die **Calmdown-Rolle** vergeben.")
await user.add_roles(role)
if duration < 300:
await utils.send_dm(user, f"Dir wurde für {duration} Minuten die **Mute-Rolle** vergeben. Du kannst weiterhin alle Kanäle lesen, aber erst nach Ablauf der Zeit wieder an Gesprächen teilnehmen.")
else:
await utils.send_dm(user, f"Bis {till.strftime(self.fmt)} Uhr trägst du die Mute-Rolle. Du kannst weiterhin alle Kanäle lesen, aber erst nach Ablauf der Zeit wieder an Gesprächen teilnehmen.")
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment