added funcs
This commit is contained in:
220
app/bot/cogs/app.py
Normal file
220
app/bot/cogs/app.py
Normal file
@@ -0,0 +1,220 @@
|
||||
import logging
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
import asyncio
|
||||
from plexapi.myplex import MyPlexAccount
|
||||
from discord import Webhook, AsyncWebhookAdapter
|
||||
from app.bot.helper.confighelper import roles, PLEXUSER, PLEXPASS, PLEX_SERVER_NAME, Plex_LIBS
|
||||
logging.basicConfig(filename="app/config/invitarr.log", filemode='a', level=logging.ERROR)
|
||||
import app.bot.helper.db as db
|
||||
import app.bot.helper.plexhelper as plexhelper
|
||||
import texttable
|
||||
import os
|
||||
|
||||
try:
|
||||
account = MyPlexAccount(PLEXUSER, PLEXPASS)
|
||||
plex = account.resource(PLEX_SERVER_NAME).connect() # returns a PlexServer instance
|
||||
logging.info('Logged into plex!')
|
||||
except:
|
||||
logging.error('Error with plex login. Please check username and password and Plex server name.')
|
||||
|
||||
class app(commands.Cog):
|
||||
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_ready(self):
|
||||
logging.info('Made by Sleepingpirate https://github.com/Sleepingpirates/')
|
||||
logging.info(f'Logged in as {self.bot.user} (ID: {self.bot.user.id})')
|
||||
logging.info('------')
|
||||
|
||||
async def embederror(self, author, message):
|
||||
embed1 = discord.Embed(title="ERROR",description=message, color=0xf50000)
|
||||
await author.send(embed=embed1)
|
||||
|
||||
async def embedinfo(self, author, message):
|
||||
embed1 = discord.Embed(title=message, color=0x00F500)
|
||||
await author.send(embed=embed1)
|
||||
|
||||
async def getemail(self, after):
|
||||
email = None
|
||||
await self.embedinfo(after,'Welcome To '+ PLEX_SERVER_NAME +'. Just reply with your email so we can add you to Plex!')
|
||||
await self.embedinfo(after,'I will wait 15 minutes for your message, if you do not send it by then I will cancel the command.')
|
||||
while(email == None):
|
||||
def check(m):
|
||||
return m.author == after and not m.guild
|
||||
try:
|
||||
email = await self.bot.wait_for('message', timeout=200, check=check)
|
||||
if(plexhelper.verifyemail(str(email.content))):
|
||||
return str(email.content)
|
||||
else:
|
||||
email = None
|
||||
message = "Invalid email. Please just type in your email and nothing else."
|
||||
await self.embederror(after, message)
|
||||
continue
|
||||
except asyncio.TimeoutError:
|
||||
message = "Timed Out. Message Server Admin with your email so They Can Add You Manually."
|
||||
await self.embederror(after, message)
|
||||
return None
|
||||
|
||||
async def addtoplex(self, email, channel):
|
||||
if(plexhelper.verifyemail(email)):
|
||||
if plexhelper.plexadd(plex,email):
|
||||
await self.embedinfo(channel, 'There was an error adding this email address. Message Server Admin.')
|
||||
return True
|
||||
else:
|
||||
await self.embederror(channel, 'There was an error adding this email address. Check logs.')
|
||||
return False
|
||||
else:
|
||||
await self.embederror(channel, 'Invalid email.')
|
||||
return False
|
||||
|
||||
async def removefromplex(self, email, channel):
|
||||
if(plexhelper.verifyemail(email)):
|
||||
if plexhelper.plexadd(plex,email):
|
||||
await self.embedinfo(channel, 'There was an error removing this email address. Message Server Admin.')
|
||||
return True
|
||||
else:
|
||||
await self.embederror(channel, 'There was an error removing this email address. Check logs.')
|
||||
return False
|
||||
else:
|
||||
await self.embederror(channel, 'Invalid email.')
|
||||
return False
|
||||
|
||||
#Auto add or remove user from plex if role is given or taken.
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_member_update(self, before, after):
|
||||
roles_in_guild = after.guild.roles
|
||||
role = None
|
||||
for role_for_app in roles:
|
||||
for role_in_guild in roles_in_guild:
|
||||
if role_in_guild.name == role_for_app:
|
||||
role = role_in_guild
|
||||
|
||||
if role is not None and (role in after.roles and role not in before.roles):
|
||||
email = await self.getemail(after)
|
||||
if email is not None:
|
||||
await self.embedinfo(after, "Got it we will be adding your email to plex shortly!")
|
||||
if plexhelper.plexadd(plex,email):
|
||||
db.save_user(str(after.id), email)
|
||||
await asyncio.sleep(5)
|
||||
await self.embedinfo(after, 'You have Been Added To Plex! Login to plex and accept the invite!')
|
||||
else:
|
||||
await self.embedinfo(after, 'There was an error adding this email address. Message Server Admin.')
|
||||
return
|
||||
|
||||
elif role is not None and (role not in after.roles and role in before.roles):
|
||||
try:
|
||||
user_id = after.id
|
||||
email = db.get_useremail(user_id)
|
||||
plexremove(email)
|
||||
deleted = db.delete_user(user_id)
|
||||
if deleted:
|
||||
logging.info("Removed {} from db".format(email))
|
||||
#await secure.send(plexname + ' ' + after.mention + ' was removed from plex')
|
||||
else:
|
||||
logging.error("Cannot remove this user from db.")
|
||||
except:
|
||||
logging.error("Cannot remove this user from plex.")
|
||||
return
|
||||
|
||||
|
||||
@commands.has_permissions(administrator=True)
|
||||
@commands.command()
|
||||
async def plexinvite(self, ctx):
|
||||
email = str(ctx.content)
|
||||
await self.addtoplex(email, ctx.channel)
|
||||
|
||||
@commands.has_permissions(administrator=True)
|
||||
@commands.command()
|
||||
async def plexremove(self, ctx):
|
||||
email = str(ctx.content)
|
||||
await self.removefromplex(email, ctx.channel)
|
||||
|
||||
@commands.has_permissions(administrator=True)
|
||||
@commands.command()
|
||||
async def dbadd(self, ctx, email, member: discord.Member):
|
||||
#await self.addtoplex(email, ctx.channel)
|
||||
if plexhelper.verifyemail(email):
|
||||
try:
|
||||
db.save_user(str(member.id), email)
|
||||
await self.embedinfo(ctx.channel,'email and user were added to the database.')
|
||||
except Exception as e:
|
||||
await self.embedinfo(ctx.channel, 'There was an error adding this email address to database.')
|
||||
logging.error(e)
|
||||
else:
|
||||
await self.embederror(ctx.channel, 'Invalid email.')
|
||||
|
||||
@commands.has_permissions(administrator=True)
|
||||
@commands.command()
|
||||
async def dbls(self, ctx):
|
||||
|
||||
embed = discord.Embed(title='Invitarr Database.')
|
||||
all = db.read_useremail()
|
||||
table = texttable.Texttable()
|
||||
table.set_cols_dtype(["t", "t", "t"])
|
||||
table.set_cols_align(["c", "c", "c"])
|
||||
header = ("#", "Name", "Email")
|
||||
table.add_row(header)
|
||||
for index, peoples in enumerate(all):
|
||||
index = index + 1
|
||||
id = int(peoples[1])
|
||||
dbuser = self.bot.get_user(id)
|
||||
dbemail = peoples[2]
|
||||
try:
|
||||
username = dbuser.name
|
||||
except:
|
||||
username = "User Not Found."
|
||||
embed.add_field(name=f"**{index}. {username}**", value=dbemail+'\n', inline=False)
|
||||
table.add_row((index, username, dbemail))
|
||||
|
||||
total = str(len(all))
|
||||
if(len(all)>25):
|
||||
f = open("db.txt", "w")
|
||||
f.write(table.draw())
|
||||
f.close()
|
||||
await ctx.channel.send("Database too large! Total: {total}".format(total = total),file=discord.File('db.txt'))
|
||||
else:
|
||||
await ctx.channel.send(embed = embed)
|
||||
|
||||
|
||||
|
||||
@commands.has_permissions(administrator=True)
|
||||
@commands.command()
|
||||
async def dbrm(self, ctx, position):
|
||||
embed = discord.Embed(title='Invitarr Database.')
|
||||
all = db.read_useremail()
|
||||
table = texttable.Texttable()
|
||||
table.set_cols_dtype(["t", "t", "t"])
|
||||
table.set_cols_align(["c", "c", "c"])
|
||||
header = ("#", "Name", "Email")
|
||||
table.add_row(header)
|
||||
for index, peoples in enumerate(all):
|
||||
index = index + 1
|
||||
id = int(peoples[1])
|
||||
dbuser = self.bot.get_user(id)
|
||||
dbemail = peoples[2]
|
||||
try:
|
||||
username = dbuser.name
|
||||
except:
|
||||
username = "User Not Found."
|
||||
embed.add_field(name=f"**{index}. {username}**", value=dbemail+'\n', inline=False)
|
||||
table.add_row((index, username, dbemail))
|
||||
|
||||
try:
|
||||
position = int(position) - 1
|
||||
id = all[position][1]
|
||||
email = db.get_useremail(id)
|
||||
deleted = db.delete_user(id)
|
||||
if deleted:
|
||||
logging.info("Removed {} from db".format(email))
|
||||
await self.embedinfo(ctx.channel,"Removed {} from db".format(email))
|
||||
else:
|
||||
await self.embederror(ctx.channel,"Cannot remove this user from db.")
|
||||
except Exception as e:
|
||||
logging.error(e)
|
||||
|
||||
def setup(bot):
|
||||
bot.add_cog(app(bot))
|
||||
Reference in New Issue
Block a user