added funcs

This commit is contained in:
Faiz Ahmed
2021-07-25 14:22:05 -04:00
parent 7c57851f7d
commit ceb8bc32a3
9 changed files with 348 additions and 209 deletions

220
app/bot/cogs/app.py Normal file
View 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))

View File

@@ -0,0 +1,61 @@
import configparser
from os import environ, path
from dotenv import load_dotenv
config = configparser.ConfigParser()
CONFIG_PATH = 'app/config/config.ini'
BOT_SECTION = 'bot_envs'
CONFIG_KEYS = ['username', 'password', 'discord_bot_token', 'plex_user', 'plex_pass',
'roles', 'plex_server_name', 'plex_libs', 'owner_id', 'channel_id',
'auto_remove_user']
def get_config():
"""
Function to return current config
"""
try:
config.read(CONFIG_PATH)
return config
except Exception as e:
print(e)
print('error in reading config')
return None
CONFIG_PATH = 'app/config/config.ini'
BOT_SECTION = 'bot_envs'
# settings
Discord_bot_token = ""
roles = ""
PLEXUSER = ""
PLEXPASS = ""
PLEX_SERVER_NAME = ""
Plex_LIBS = ""
chan = 0
ownerid = 0
auto_remove_user = ""
switch = 0
try:
load_dotenv(dotenv_path='bot.env')
# settings
Discord_bot_token = environ.get('discord_bot_token')
roles = (environ.get('roles')) # Role Id, right click the role and copy id.
PLEXUSER = environ.get('plex_user') # Plex Username
PLEXPASS = environ.get('plex_pass') # plex password
PLEX_SERVER_NAME = environ.get('plex_server_name') # Name of plex server
Plex_LIBS = environ.get('plex_libs') #name of the libraries you want the user to have access to.
chan = int(environ.get('channel_id'))
ownerid = int(environ.get('owner_id'))
auto_remove_user = environ.get('auto_remove_user') if environ.get('auto_remove_user') else False # auto remove user from plex and db if removed from the role
switch = 1
if switch == 1:
Plex_LIBS = list(Plex_LIBS.split(','))
roles = list(roles.split(','))
except Exception as e:
print(e)

83
app/bot/helper/db.py Normal file
View File

@@ -0,0 +1,83 @@
import sqlite3
DB_URL = 'app/config/app.db'
def create_connection(db_file):
""" create a database connection to a SQLite database """
conn = None
try:
conn = sqlite3.connect(db_file)
print("Connected to db")
except Error as e:
print("error in connecting to db")
finally:
if conn:
return conn
def checkTableExists(dbcon, tablename):
dbcur = dbcon.cursor()
dbcur.execute("""SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='{0}';""".format(tablename.replace('\'', '\'\'')))
if dbcur.fetchone()[0] == 1:
dbcur.close()
return True
dbcur.close()
return False
conn = create_connection(DB_URL)
# Checking if table exists
if checkTableExists(conn, 'clients'):
print('Table exists.')
else:
conn.execute('''
CREATE TABLE "clients" (
"id" INTEGER NOT NULL UNIQUE,
"discord_username" TEXT NOT NULL UNIQUE,
"email" TEXT NOT NULL,
PRIMARY KEY("id" AUTOINCREMENT)
);
''')
def save_user(username, email):
if username and email:
conn.execute("INSERT INTO clients (discord_username, email) VALUES ('"+ username +"', '" + email + "')")
conn.commit()
print("User added to db.")
else:
return "Username or email cannot be empty"
def get_useremail(username):
if username:
try:
cursor = conn.execute('SELECT discord_username, email from clients where discord_username="{}";'.format(username))
for row in cursor:
email = row[1]
if email:
return email
else:
return "No users found"
except:
return "error in fetching from db"
else:
return "username cannot be empty"
def delete_user(username):
if username:
try:
conn.execute('DELETE from clients where discord_username="{}";'.format(username))
conn.commit()
return True
except:
return False
else:
return "username cannot be empty"
def read_useremail():
cur = conn.cursor()
cur.execute("SELECT * FROM clients")
rows = cur.fetchall()
all = []
for row in rows:
#print(row[1]+' '+row[2])
all.append(row)
return all

View File

@@ -0,0 +1,55 @@
from plexapi.myplex import MyPlexAccount
import re
from app.bot.helper.confighelper import Plex_LIBS
import logging
logging.basicConfig(filename="app/config/plex.log", filemode='a', level=logging.ERROR)
def plexadd(plex, plexname):
global Plex_LIBS
try:
if Plex_LIBS[0] == "all":
Plex_LIBS = plex.library.sections()
plex.myPlexAccount().inviteFriend(user=plexname, server=plex, sections=Plex_LIBS, allowSync=False,
allowCameraUpload=False, allowChannels=False, filterMovies=None,
filterTelevision=None, filterMusic=None)
logging.info(plexname +' has been added to plex')
return True
except Exception as e:
logging.error(e)
return False
def plexremove(plex, plexname):
try:
plex.myPlexAccount().removeFriend(user=plexname)
logging.info(plexname +' has been removed from plex')
return True
except Exception as e:
logging.error(e)
return False
'''
plex python api has no tools to remove unaccepted invites...
logging.info("Trying to remove invite...")
removeinvite = plexremoveinvite(plex, plexname)
if removeinvite:
return True
'''
'''
def plexremoveinvite(plex, plexname):
try:
plex.myPlexAccount().removeFriend(user=plexname)
logging.info(plexname +' has been removed from plex')
return True
except Exception as e:
logging.error(e)
return False
'''
def verifyemail(addressToVerify):
regex = '^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$'
match = re.match(regex, addressToVerify)
if match == None:
return False
else:
return True

0
app/bot/test.py Normal file
View File