import asyncio import json import os import random import re import time from typing import Optional import discord from discord.ext import commands from dotenv import load_dotenv load_dotenv() TOKEN = os.getenv('DISCORD_TOKEN') CONFIG = 'config.json' PING_REGEX = re.compile(r'\b(?:ge)?ping', re.IGNORECASE) TOPFIT_REGEX = re.compile(r'\b(topfit|fit|top|micro|microsoft|virtual reality|vr|ä+h*m*|hä*)\b', re.IGNORECASE) LOEH_REGEX = re.compile(r'Och L(?:oe|ö)h!?', re.IGNORECASE) TOPFIT_WORDS = ( "äh", "ähm", "ääh", "äääh", "ä", "..", "...", "Mi", "Mic", "Micro", "Microsoft", "Microservices", "top", "vortual reality" ) # LOEH_ID = 327126546970312739 LOEH_ID = 254265844928872448 SIP_ID = 327126546970312739 config: dict = { 'loeh-timeout': 10, 'loeh-cooldown': 20, 'prefix': 'och!' } last_loeh = 0 def load_config() -> dict: try: config_file = open(CONFIG, 'r') config.update(json.load(config_file)) except (json.JSONDecodeError, FileNotFoundError): pass return config def save_config(): with open(CONFIG, 'w') as config_file: json.dump(config, config_file) load_config() bot = commands.Bot(command_prefix=config.get('prefix')) async def get_loeh(guild: discord.Guild) -> Optional[discord.Member]: try: return await guild.fetch_member(LOEH_ID) except discord.NotFound: return None @bot.event async def on_ready(): print(f'{bot.user} has connected to Discord!') @bot.event async def on_message(message: discord.Message): global last_loeh, config if not message.author.bot: if LOEH_REGEX.match(message.content): if message.author.id == LOEH_ID: await message.channel.send("https://siphalor.de/img/spidy-is-that-you.jpg") else: t = time.time() if t - config['loeh-cooldown'] <= last_loeh: await message.channel.send('Don\'t try this to often, **' + message.author.nick + '**. That might backfire.') last_loeh = t return last_loeh = t loeh = await get_loeh(message.guild) if loeh is None: await message.channel.send('404: Löh not found!') else: try: await loeh.edit(mute=True) sleeper = asyncio.sleep(config.get('loeh-timeout')) message: Optional[discord.Message] = await message.channel.send('Zu Befehl!') await sleeper await loeh.edit(mute=False) if message is not None: await message.edit(content="~~Zu Befehl!~~\nEs sei ihm verziehen.") except (discord.Forbidden, discord.HTTPException): await message.channel.send('Failed to complete your command, Sir') return elif PING_REGEX.search(message.content): embed = discord.Embed( title="*pinken, schwaches Verb*", description="ein Netzwerkgerät testweise ansprechen.\nOft falsch geschrieben als pin__g__en", color=16636435 ) embed.add_field(name='ich', value='pinke') embed.add_field(name='du', value='pinkst') embed.add_field(name='er|sie|es', value='pinkt') embed.add_field(name='wir', value='pinken') embed.add_field(name='ihr', value='pinkt') embed.add_field(name='sie', value='pinken') embed.add_field(name='Partizip 2', value='gepinkt') await message.channel.send(embed=embed) else: match = TOPFIT_REGEX.search(message.content) if match is not None: text = '' for i in range(0, random.randint(7, 13)): text += random.choice(TOPFIT_WORDS) + " " text += match.group() await message.channel.send(text) await bot.process_commands(message) @bot.command(name='config') async def config_prefix_command(ctx: commands.Context, cmd: str = '', key: str = '', *, val: str = ''): if ctx.author.id != SIP_ID: await ctx.send('You\'re not allowed to touch my most valuable piece') return if cmd == '': await ctx.send('Use `config get` or `config set` to query for or update config values. Use `config list` to ' 'see all config options') elif cmd == 'list': await ctx.send('Available config options:\n' ' - `prefix`: Set the bot prefix\n' ' - `loeh-timeout`: The timeout for Löh in seconds' ' - `loeh-cooldown`: Number of seconds between timeouts') elif cmd == 'get': if key in config: await ctx.send('`' + key + '` is set to ' + str(config.get(key))) else: await ctx.send('Unknown config option "' + key + '"') elif cmd == 'set': try: if key == 'prefix': config['prefix'] = val elif key == 'loeh-timeout': config['loeh-timeout'] = int(val) elif key == 'loeh-cooldown': config['loeh-cooldown'] = int(val) save_config() await ctx.send('Config successfully updated') except (ValueError, TypeError): await ctx.send('Invalid value "' + val + '" for config `' + key + '`') bot.run(TOKEN)