Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #SAVE AS: bot_longfuncs.py
- #########################################################################################################################################
- ###############################################################MODULE IMPORT#############################################################
- #########################################################################################################################################
- import json
- from datetime import datetime
- import sys
- import os
- import base64
- import mimetypes
- import time
- import random
- import io
- import re
- import traceback
- import warnings
- from skimage.measure import compare_ssim as ssim #pip install scikit-image
- import cv2 #pip install opencv-python
- import discord #pip install -U discord.py[voice]
- import asyncio #pip install -U discord.py[voice]
- import aiohttp #pip install -U discord.py[voice]
- import numpy as np #pip install opencv-python
- from discord.ext import commands #pip install -U discord.py[voice]
- from googleapiclient.discovery import build #pip install --upgrade google-api-python-client
- from apiclient.errors import HttpError #pip install --upgrade google-api-python-client
- from oauth2client.tools import argparser #pip install --upgrade oauth2client
- try:
- from PIL import Image #pip install PIL
- except:
- import Image #pip install Image
- client = discord.Client()
- URL_REGEX = r"""(?i)\b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?:com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)/)(?:[^\s()<>{}\[\]]+|\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\))+(?:\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?:com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)\b/?(?!@)))"""
- async def OverflowMessage(message,channel):
- try:
- cummsg = ""
- overflownewline = False
- for i in [x + "\n" for x in message.split("\n")]:
- if len(i) > 1800:
- overflownewline = True
- if cummsg != "":
- await client.send_message(channel, cummsg)
- message = message.replace(cummsg,"")
- break
- elif len(cummsg+i) > 1800:
- await client.send_message(channel, cummsg)
- message = message.replace(cummsg,"")
- cummsg = i
- else:
- cummsg += i
- if overflownewline:
- for i in message:
- if len(cummsg+i) > 1800:
- await client.send_message(channel, cummsg)
- message = message.replace(cummsg,"")
- cummsg = i
- else:
- cummsg += i
- if cummsg != "":
- await client.send_message(channel, cummsg)
- cummsg = ""
- else:
- await client.send_message(channel, cummsg)
- return True
- except Exception as e:
- return str(e)
- async def IsStaff(message,author=None):
- isstaff = False
- if author == None:
- author = bot.server.get_member(message.author.id)
- else:
- author = bot.server.get_member(author.id)
- staffranks = ["Admin","Legislator","Moderator","Moderators","Gate Keeper"]
- playerroles = author.roles
- for i in playerroles:
- if i.name in staffranks:
- return True
- return False
- async def DoCmd(message):
- if not(await IsStaff(message) or message.author.id == "380793206033612809"):
- try:
- await client.delete_message(message)
- except:
- pass
- return False
- return True
- ##############################################################################################################
- ##############################################################################################################
- ##########################################START OF !FUNCTIONS#################################################
- ##############################################################################################################
- async def ImageBlacklist(message):
- if message.channel.id in ["413584030928338945","400113786457161728"]:#Sexy Chaos, Chaos
- return
- imgsfound = await FindImages(message)
- if imgsfound == None:
- return
- startimgs = datetime.now()
- for img in imgsfound:
- filename = img.rsplit("/",1)[1]
- if filename.endswith(".gif"):
- continue
- async with aiohttp.ClientSession() as cs:
- async with cs.get(img) as r:
- try:
- content = await r.content.read()
- imgb = Image.open(io.BytesIO(content))
- imgb.save(filename)
- original = cv2.imread(filename)
- try:
- os.remove(filename)
- except OSError:
- pass
- original = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
- oheight, owidth = original.shape[:2]
- for i in os.listdir(os.path.join("blacklist","fat")):
- if mimetypes.guess_type(i)[0] != None and "image" in mimetypes.guess_type(i)[0]:
- compare = cv2.imread(os.path.join(os.path.join("blacklist","fat"),i))
- try:
- compare = cv2.cvtColor(compare, cv2.COLOR_BGR2GRAY)
- except:
- print("ERROR WITH FILE: "+i)
- continue
- compare = cv2.resize(compare,(owidth, oheight), interpolation = cv2.INTER_CUBIC)
- ssim_index = ssim(original, compare, data_range=compare.max() - compare.min())
- if ssim_index>=0.85:
- await client.delete_message(message)
- await client.send_message(message.channel,"<@"+message.author.id+">, sorry, but: https://cdn.discordapp.com/attachments/400113786457161728/442566754321825799/unknown.png")
- return
- for i in os.listdir(os.path.join("blacklist","silent")):
- if mimetypes.guess_type(i)[0] != None and "image" in mimetypes.guess_type(i)[0]:
- compare = cv2.imread(os.path.join(os.path.join("blacklist","silent"),i))
- try:
- compare = cv2.cvtColor(compare, cv2.COLOR_BGR2GRAY)
- except:
- print("ERROR WITH FILE: "+i)
- continue
- compare = cv2.resize(compare,(owidth, oheight), interpolation = cv2.INTER_CUBIC)
- ssim_index = ssim(original, compare, data_range=compare.max() - compare.min())
- if ssim_index>=0.85:
- try:
- await client.delete_message(message)
- except:
- pass
- return
- except:
- print("BLACKLIST FAILURE")
- print(traceback.format_exc())
- async def FindImages(message):
- dl_urls = []
- dled_urls = []
- if len(message.attachments) != 0:
- for att in message.attachments:
- dl_urls.append(att["url"])
- if len(re.findall(URL_REGEX,message.content)) !=0: #URL
- for urlfound in re.findall(URL_REGEX,message.content):
- dl_urls.append(urlfound)
- for urlfound in dl_urls:
- if mimetypes.guess_type(urlfound)[0] != None and "image" in mimetypes.guess_type(urlfound)[0]:
- dled_urls.append(urlfound)
- if dled_urls == []:
- return None
- else:
- return dled_urls
- async def BlacklistScan(message,silent=False):
- if not(silent):
- tmp_blacklistscanmsg = await client.send_message(message.channel,"**Scanning chat with new blacklist parameters.**")
- async for scanmsg in client.logs_from(message.channel, limit=99):
- if scanmsg.timestamp != message.timestamp:
- await ImageBlacklist(scanmsg)
- if not(silent):
- await client.delete_message(tmp_blacklistscanmsg)
- tmp_blacklistscanmsg = await client.send_message(message.channel,"**Blacklist scan complete.**")
- await asyncio.sleep(5)
- await client.delete_message(tmp_blacklistscanmsg)
- async def BlacklistCMD(message):
- if message.content.lower().startswith(bot.prefix+"fatban"):
- cando = await DoCmd(message)
- if not(cando):
- return
- #cmdmsg = message.content.lower().replace(bot.prefix+"fatban","").strip()
- foundimgs = await FindImages(message)
- if foundimgs == None:
- print("Error, no images found in blacklist updater command")
- return
- successes = 0
- for img in foundimgs:
- filename = img.rsplit("/",1)[1]
- async with aiohttp.ClientSession() as cs:
- async with cs.get(img) as r:
- try:
- content = await r.content.read()
- imgb = Image.open(io.BytesIO(content))
- imgb.save(os.path.join("blacklist","fat",datetime.now().strftime("%Y-%b-%d_%Hh%Mm%Ss__")+filename))
- successes +=1
- except:
- print("AddToBlackListFailure")
- print(traceback.format_exc())
- if successes == len(foundimgs):
- tmp_blacklistmsg = await client.send_message(message.channel,"__Blacklist updated.__")
- await asyncio.sleep(5)
- await client.delete_message(tmp_blacklistmsg)
- await BlacklistScan(message)
- else:
- tmp_blacklistmsg = await client.send_message(message.channel,"__Blacklist updated.__\nError, "+str(successes)+"/"+len(foundimgs))
- await asyncio.sleep(5)
- await client.delete_message(tmp_blacklistmsg)
- try:
- await client.delete_message(message)
- except:
- pass
- elif message.content.lower().startswith(bot.prefix+"hban"):
- cando = await DoCmd(message)
- if not(cando):
- return
- foundimgs = await FindImages(message)
- if foundimgs == None:
- print("Error, no images found in blacklist updater command")
- return
- successes = 0
- for img in foundimgs:
- filename = img.rsplit("/",1)[1]
- async with aiohttp.ClientSession() as cs:
- async with cs.get(img) as r:
- try:
- content = await r.content.read()
- imgb = Image.open(io.BytesIO(content))
- imgb.save(os.path.join("blacklist","silent",datetime.now().strftime("%Y-%b-%d_%Hh%Mm%Ss__")+filename))
- successes +=1
- except:
- print("AddToBlackListFailure")
- print(traceback.format_exc())
- chnl = message.channel
- try:
- await client.delete_message(message)
- except:
- pass
- if successes == len(foundimgs):
- await BlacklistScan(message,True)
- else:
- tmp_blacklistmsg = await client.send_message(message.channel,"__Blacklist updated.__\nError, "+str(successes)+"/"+len(foundimgs))
- await asyncio.sleep(5)
- await client.delete_message(tmp_blacklistmsg)
- async def Purge(message):
- if message.content.lower().startswith(bot.prefix+"nuke"):
- cando = await DoCmd(message)
- if not(cando):
- return
- async for nukemsg in client.logs_from(message.channel, limit=99):
- if nukemsg.author.id == client.user.id:
- await client.delete_message(nukemsg)
- await client.delete_message(message)
- async def PurgeCreed(message):
- if message.content.lower().startswith(bot.prefix+"nukecreed"):
- if message.author.id == "380793206033612809":
- async for nukemsg in client.logs_from(message.channel, limit=99):
- if nukemsg.author.id == message.author.id:
- await client.delete_message(nukemsg)
- await client.delete_message(message)
- async def CApprove(message):
- if message.content.lower().startswith(bot.prefix+"capprove"):
- if message.author.id == "380793206033612809":
- async for nukemsg in client.logs_from(bot.server.get_channel("389552930639839244"), limit=99):
- if nukemsg.id == message.content.lower().replace(bot.prefix+"capprove ",""):
- sugstr = nukemsg.content.split(":**__\n")[1].split("\n** **\n** **")[0]
- sugstr = "** **\n** **\n"+str(bot.emoji_accepted)+"__**Accepted by Creed:**__"+str(bot.emoji_accepted)+"\n"+sugstr
- pinmsg = await client.send_message(nukemsg.channel, sugstr)
- try:
- await client.pin_message(pinmsg)
- except Exception as e:
- if "Maximum number of pins reached (50)" in traceback.format_exc():
- try:
- await client.unpin_message(sorted(await client.pins_from(nukemsg.channel),key = lambda msg: msg.timestamp.timestamp())[0])
- await client.pin_message(pinmsg)
- except:
- print("Failed to remove oldest pin")
- print(traceback.format_exc())
- else:
- print("Some misc issue in pinning")
- print(traceback.format_exc())
- async for msg in client.logs_from(nukemsg.channel, limit=99):
- if "pinned a message to this channel" in msg.system_content:
- try:
- await client.delete_message(msg)
- except:
- print("Failed to remove 'user has pinned message to this channel' message")
- print(traceback.format_exc())
- try:
- await client.delete_message(nukemsg)
- except:
- print("No remove permission")
- await client.delete_message(message)
- async def CDeny(message):
- if message.content.lower().startswith(bot.prefix+"cdeny"):
- if message.author.id == "380793206033612809":
- async for nukemsg in client.logs_from(bot.server.get_channel("389552930639839244"), limit=99):
- if nukemsg.id == message.content.lower().replace(bot.prefix+"cdeny ",""):
- sugstr = nukemsg.content.split(":**__\n")[1].split("\n** **\n** **")[0]
- sugstr = "** **\n** **\n"+str(bot.emoji_denied)+"__**Denied by Creed:**__"+str(bot.emoji_denied)+"\n"+sugstr
- pinmsg = await client.send_message(nukemsg.channel, sugstr)
- try:
- await client.pin_message(pinmsg)
- except Exception as e:
- if "Maximum number of pins reached (50)" in traceback.format_exc():
- try:
- await client.unpin_message(sorted(await client.pins_from(nukemsg.channel),key = lambda msg: msg.timestamp.timestamp())[0])
- await client.pin_message(pinmsg)
- except:
- print("Failed to remove oldest pin")
- print(traceback.format_exc())
- else:
- print("Some misc issue in pinning")
- print(traceback.format_exc())
- async for msg in client.logs_from(nukemsg.channel, limit=99):
- if "pinned a message to this channel" in msg.system_content:
- try:
- await client.delete_message(msg)
- except:
- print("Failed to remove 'user has pinned message to this channel' message")
- print(traceback.format_exc())
- try:
- await client.delete_message(nukemsg)
- except:
- print("No remove permission")
- await client.delete_message(message)
- async def MeganukeCMD(message):
- if message.channel.id == "442782454831382530" and message.content.lower() == bot.prefix+"meganuke":
- if message.author.id != "380793206033612809":
- return
- async for meganukemsg in client.logs_from(message.channel, limit=9999):
- await client.delete_message(meganukemsg)
- if message.content.lower().startswith(bot.prefix+"specnuke"):
- if message.author.id != "380793206033612809":
- return
- chnl = message.channel
- delid = message.content.replace(bot.prefix+"specnuke ","")
- await client.delete_message(message)
- async for meganukemsg in client.logs_from(chnl, limit=999):
- if meganukemsg.id == delid:
- await client.delete_message(meganukemsg)
- return
- for listchannel in bot.server.channels:
- try:
- async for meganukemsg in client.logs_from(listchannel, limit=99):
- if meganukemsg.id == delid:
- await client.delete_message(meganukemsg)
- return
- except:
- pass
- elif message.content.lower().startswith(bot.prefix+"sugnuke"):
- if message.author.id != "380793206033612809":
- return
- chnl = message.channel
- delid = message.content.replace(bot.prefix+"sugnuke ","")
- await client.delete_message(message)
- for listchannel in bot.server.channels:
- if not(listchannel.id in ["389552930639839244","447760673120976905","433373031013023775"]): #server, mod, staff
- continue
- try:
- async for meganukemsg in client.logs_from(listchannel, limit=999):
- if meganukemsg.id == delid:
- await client.delete_message(meganukemsg)
- return
- except:
- pass
- elif message.channel.id == "442782454831382530" and message.content.lower() == bot.prefix+"secnuke":
- cando = await DoCmd(message)
- if not(cando):
- return
- async for meganukemsg in client.logs_from(message.channel, limit=999):
- if not(meganukemsg.content.startswith("==")):
- await client.delete_message(meganukemsg)
- ##############################################################################################################
- ##############################################################################################################
- ##########################################END OF !FUNCTIONS###################################################
- ##############################################################################################################
- ##########BOT ON MESSAGE##############
- @client.event
- async def on_message(message):
- if not bot.ready: #Race condition
- return
- #Skip entirely if its in the ignorelist
- if message.author.id in bot.ignorelist or message.channel.id in bot.ignorelist:
- return
- await ImageBlacklist(message)
- await BlacklistCMD(message)
- await Purge(message)
- await PurgeCreed(message)
- await CApprove(message)
- await CDeny(message)
- await MeganukeCMD(message)
- ##########BOT ERROR CATCHING##########
- @client.event
- async def on_error(event,args="",kwargs=""):
- print("BOT EXCEPTION:")
- print(traceback.format_exc())
- try:
- with open("errors_longfuncs.txt", "a") as f:
- f.write("\n\n"+traceback.format_exc()+"\n\n")
- except:
- try:
- print("ERROR: NO ERRORS FILE, WRITING")
- with open("errors_longfuncs.txt","w") as f:
- f.write("\n\n"+traceback.format_exc()+"\n\n")
- except:
- print("ERROR: NO FILESYSTEM ACCESS")
- ##############BOT INIT################
- @client.event
- async def on_ready():
- print("--ADVANCED/TIME-INSENSITIVE BOT FUNCTIONS--")
- print('BOT_NAME: ' + client.user.name)
- print('BOT_ID: ' + client.user.id)
- print('\n\n--VAR_ASSIGN--')
- try:
- bot.prefix = bot.config.split("prefix=")[1].split("\n")[0]
- print("BOT_PREFIX: "+bot.prefix)
- bot.ignorelist = bot.config.split("ignorelist=")[1].split("\n")[0]
- print("BOT_IGNORELIST: "+bot.ignorelist)
- bot.server = bot.config.split("discord_server=")[1].split("\n")[0]
- print("SERVER_ID: "+bot.server)
- bot.meganuke = ""
- except:
- print("FAILURE TO READ CONFIG")
- print(traceback.format_exc())
- raise Exception('Incorrect config.')
- try:
- print("\n\n--DYNAMIC_VAR_INIT--")
- bot.server = client.get_server(bot.server)
- print("SERVER_NAME: "+bot.server.name)
- for i in bot.server.emojis:
- if i.name == "accepted":
- bot.emoji_accepted = i
- if i.name == "denied":
- bot.emoji_denied = i
- print("ADDED_EMOJI: "+bot.emoji_accepted.name)
- print("ADDED_EMOJI: "+bot.emoji_denied.name)
- bot.ready = True
- print("\n\n--READY--")
- #await DoPurgeReminder()
- except:
- print("CRITICAL ERROR: FAILURE TO ASSIGN CHANNELS")
- client.close()
- client.logout()
- raise Exception("CRITICAL ERROR: FAILURE TO ASSIGN CHANNELS")
- #############################END OF INITIALIZATION#############################
- class BotVars:
- pass
- if __name__ == '__main__':
- try:
- bot = BotVars()
- bot.ready = False
- #########################################################################################################################################
- ###############################################################VARIABLE INIT#############################################################
- #########################################################################################################################################
- bot.token = None
- print("--TOKEN_INIT--")
- try:
- with open("config", "r") as f:
- bot.config = f.read()
- bot.token = bot.config.split("token=")[1].split("\n")[0]
- print("DISCORD TOKEN: " + bot.token[:int(len(bot.token)/2)]+str("*"*(int(len(bot.token)/2)-4))+bot.token[:4])
- except:
- print("FAILURE TO READ CONFIG")
- print(traceback.format_exc())
- raise Exception('Incorrect config.')
- print("\n\n--LOGIN--")
- client.run(bot.token)
- except Exception as e:
- botexception = traceback.format_exc()
- print(traceback.format_exc())
- print("EXCEPTION '" + str(e) + "'")
- try:
- client.close()
- except:
- pass
- try:
- client.logout()
- except:
- pass
- with open("exception.txt", "w") as inputfile:
- if "logout" in str(botexception):
- inputfile.write("logout")
- else:
- inputfile.write(str(botexception))
- print("--FAILURE--")
- time.sleep(5)
Add Comment
Please, Sign In to add comment