Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import discord | |
import os | |
import threading | |
import gradio as gr | |
import requests | |
import json | |
import random | |
import time | |
import re | |
from discord import Embed, Color | |
from discord.ext import commands | |
from gradio_client import Client | |
from PIL import Image | |
from ratelimiter import RateLimiter | |
from datetime import datetime # for times | |
from pytz import timezone # for times | |
import asyncio # check if used | |
zurich_tz = timezone("Europe/Zurich") | |
def convert_to_timezone(dt, tz): | |
return dt.astimezone(tz).strftime("%Y-%m-%d %H:%M:%S %Z") | |
DISCORD_TOKEN = os.environ.get("DISCORD_TOKEN", None) | |
intents = discord.Intents.all() | |
bot = commands.Bot(command_prefix='!', intents=intents) | |
#rate_limiter = RateLimiter(max_calls=10, period=60) # needs testing | |
# todo | |
''' | |
- test what works | |
->delete | |
->edit | |
-x>nicknames | |
- add role changes (moving roles) | |
discord.gg / discord/invite (block completely, need to be cautious) | |
attempted @everyone / @here pings, or trying to use those strings (ping @alerts) | |
ping alerts for list of keywords | |
- backup? | |
- more alerts for more stuff? | |
''' | |
# stats stuff --------------------------------------------------------------------------------------------------------------------------------------------------------- | |
number_of_messages = 0 | |
async def on_message(message): | |
try: | |
global number_of_messages | |
if message.author != bot.user: | |
user = bot.get_user(811235357663297546) #811235357663297546 | |
number_of_messages = number_of_messages + 1 | |
message_link = f"[#{message.channel.name}]({message.jump_url})" | |
dm_message = await user.send(f"{number_of_messages}| {message_link} |{message.author}: {message.content}") | |
# Allow other event handlers to process the message | |
await bot.process_commands(message) | |
except Exception as e: | |
print(f"Error: {e}") | |
# moderation stuff----------------------------------------------------------------------------------------------------------------------------------------------------- | |
async def on_message_edit(before, after): | |
try: | |
if before.author == bot.user: | |
return | |
if before.content != after.content: | |
embed = Embed(color=Color.orange()) | |
embed.set_author(name=f"{before.author} ID: {before.author.id}", icon_url=before.author.avatar.url) | |
embed.title = "Message Edited" | |
embed.description = f"**Before:** {before.content or '*(empty message)*'}\n**After:** {after.content or '*(empty message)*'}" | |
embed.add_field(name="Author Username", value=before.author.name, inline=True) | |
embed.add_field(name="Channel", value=before.channel.mention, inline=True) | |
#embed.add_field(name="Message Created On", value=before.created_at.strftime("%Y-%m-%d %H:%M:%S UTC"), inline=True) | |
embed.add_field(name="Message Created On", value=convert_to_timezone(before.created_at, zurich_tz), inline=True) | |
embed.add_field(name="Message ID", value=before.id, inline=True) | |
embed.add_field(name="Message Jump URL", value=f"[Jump to message!](https://discord.com/channels/{before.guild.id}/{before.channel.id}/{before.id})", inline=True) | |
if before.attachments: | |
attachment_urls = "\n".join([attachment.url for attachment in before.attachments]) | |
embed.add_field(name="Attachments", value=attachment_urls, inline=False) | |
#embed.set_footer(text=f"{datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC')}") | |
embed.set_footer(text=f"{convert_to_timezone(datetime.utcnow(), zurich_tz)}") | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
async def on_message_delete(message): | |
try: | |
if message.author == bot.user: | |
return | |
embed = Embed(color=Color.red()) | |
embed.set_author(name=f"{message.author} ID: {message.author.id}", icon_url=message.author.avatar.url) | |
embed.title = "Message Deleted" | |
embed.description = message.content or "*(empty message)*" | |
embed.add_field(name="Author Username", value=message.author.name, inline=True) | |
embed.add_field(name="Channel", value=message.channel.mention, inline=True) | |
#embed.add_field(name="Message Created On", value=message.created_at.strftime("%Y-%m-%d %H:%M:%S UTC"), inline=True) | |
embed.add_field(name="Message Created On", value=convert_to_timezone(message.created_at, zurich_tz), inline=True) | |
embed.add_field(name="Message ID", value=message.id, inline=True) | |
embed.add_field(name="Message Jump URL", value=f"[Jump to message!](https://discord.com/channels/{message.guild.id}/{message.channel.id}/{message.id})", inline=True) | |
if message.attachments: | |
attachment_urls = "\n".join([attachment.url for attachment in message.attachments]) | |
embed.add_field(name="Attachments", value=attachment_urls, inline=False) | |
#embed.set_footer(text=f"{datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC')}") | |
embed.set_footer(text=f"{convert_to_timezone(datetime.utcnow(), zurich_tz)}") | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
# nickname stuff --------------------------------------------------------------------------------------------------------------------------- | |
async def on_member_update(before, after): | |
try: | |
""" | |
if before.name != after.name: | |
async for entry in before.guild.audit_logs(limit=5): | |
print(f'{entry.user} did {entry.action} to {entry.target}') | |
""" | |
if before.nick != after.nick: | |
embed = Embed(color=Color.orange()) | |
embed.set_author(name=f"{after} ID: {after.id}", icon_url=after.avatar.url) | |
embed.title = "Nickname Modified" | |
embed.add_field(name="Mention", value=after.mention, inline=True) | |
embed.add_field(name="Old", value=before.nick, inline=True) | |
embed.add_field(name="New", value=after.nick, inline=True) | |
embed.set_footer(text=f"{convert_to_timezone(datetime.utcnow(), zurich_tz)}") | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
async def on_member_ban(guild, user): | |
try: | |
print("1") | |
async for entry in guild.audit_logs(limit=5, action=discord.AuditLogAction.ban): | |
print("2") | |
if entry.target == user: | |
print("3") | |
account_age = datetime.utcnow() - user.created_at | |
created_and_age = f"{user.created_at} ({account_age})" | |
reason = f"Reason: {entry.reason}" if entry.reason else "No reason provided." | |
content = "<@&1108342563628404747>" # @alerts role | |
print("4") | |
embed = Embed(color=Color.red()) | |
embed.set_author(name=f"{user} ID: {user.id}", icon_url=user.avatar.url) | |
embed.title = "User Banned" | |
embed.add_field(name="User", value=user.mention, inline=True) | |
embed.add_field(name="Nickname", value=user.nick, inline=True) | |
embed.add_field(name="Account Age", value=created_and_age, inline=True) | |
embed.add_field(name="Moderator", value=entry.user.mention, inline=True) | |
embed.add_field(name="Nickname", value=entry.user.nick, inline=True) | |
embed.add_field(name="Reason", value=reason, inline=False) | |
embed.set_footer(text=f"{convert_to_timezone(datetime.utcnow(), zurich_tz)}") | |
print("5") | |
await bot.log_channel.send(content=content, embed=embed) | |
""" | |
# member banned from the guild | |
embed = Embed(description=f'Member {user.mention} was banned from the guild', color=Color.red()) | |
await bot.log_channel.send(embed=embed) | |
""" | |
except Exception as e: | |
print(f"Error: {e}") | |
""" | |
async for entry in before.guild.audit_logs(limit=5): | |
print(f'{entry.user} did {entry.action} to {entry.target}') (and add reason if it exists) | |
""" | |
async def on_member_unban(guild, user): | |
try: | |
# member unbanned from the guild | |
embed = Embed(description=f'Member {user.mention} was unbanned from the guild', color=Color.green()) | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
# admin stuff----------------------------------------------------------------------------------------------------------------------- | |
async def on_guild_channel_create(channel): | |
try: | |
# creating channels | |
embed = Embed(description=f'Channel {channel.mention} was created', color=Color.green()) | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
async def on_guild_channel_delete(channel): | |
try: | |
# deleting channels, should ping @alerts for this | |
embed = Embed(description=f'Channel {channel.name} ({channel.mention}) was deleted', color=Color.red()) | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
async def on_guild_role_create(role): | |
try: | |
# creating roles | |
embed = Embed(description=f'Role {role.mention} was created', color=Color.green()) | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
async def on_guild_role_delete(role): | |
try: | |
# deleting roles, should ping @alerts for this | |
embed = Embed(description=f'Role {role.name} ({role.mention}) was deleted', color=Color.red()) | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
async def on_guild_role_update(before, after): | |
try: | |
# editing roles, could expand this | |
if before.name != after.name: | |
embed = Embed(description=f'Role {before.mention} was renamed to {after.name}', color=Color.orange()) | |
await bot.log_channel.send(embed=embed) | |
if before.permissions.administrator != after.permissions.administrator: | |
# changes involving the administrator permission / sensitive permissions (can help to prevent mistakes) | |
content = "<@&1108342563628404747>" # @alerts role | |
embed = Embed(description=f'Role {after.mention} had its administrator permission {"enabled" if after.permissions.administrator else "disabled"}', color=Color.red()) | |
await bot.log_channel.send(content=content, embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
async def on_voice_state_update(member, before, after): | |
try: | |
if before.mute != after.mute: | |
# muting members | |
embed = Embed(description=f'{member} was {"muted" if after.mute else "unmuted"} in voice chat', color=Color.orange()) | |
await bot.log_channel.send(embed=embed) | |
if before.deaf != after.deaf: | |
# deafening members | |
embed = Embed(description=f'{member} was {"deafened" if after.deaf else "undeafened"} in voice chat', color=Color.orange()) | |
await bot.log_channel.send(embed=embed) | |
except Exception as e: | |
print(f"Error: {e}") | |
# github test stuff ------------------------------------------------------------------------------------------------------------------- | |
""" | |
async def check_github(): | |
url = f'https://api.github.com/repos/{github_repo}/pulls' | |
response = requests.get(url) | |
pulls = response.json() | |
for pull in pulls: | |
# Check if the pull request was just opened | |
if pull['state'] == 'open' and pull['created_at'] == pull['updated_at']: | |
channel = client.get_channel(channel_id) | |
if channel: | |
await channel.send(f'New PR opened: {pull["title"]}') | |
""" | |
# bot stuff --------------------------------------------------------------------------------------------------------------------------- | |
async def on_ready(): | |
print('Logged on as', bot.user) | |
#bot.test_channel = bot.get_channel(1100458786826747945) # bot-test | |
bot.log_channel = bot.get_channel(1036960509586587689) # admin-logs | |
def run_bot(): | |
bot.run(DISCORD_TOKEN) | |
threading.Thread(target=run_bot).start() | |
def greet(name): | |
return "Hello " + name + "!" | |
demo = gr.Interface(fn=greet, inputs="text", outputs="text") | |
demo.launch() |