Info_edupage/Edu-kun_v.2.0-linux/extensions/Edupage.py
Untriex Programming 9b6723e11e Initial commit
2021-08-31 22:06:02 +02:00

691 lines
25 KiB
Python

import json
import time
import requests
from datetime import datetime, timedelta
import copy
import discord
from discord.ext import commands
from discord.ext import tasks
import schedule
import string
class Edupage(commands.Cog):
def __init__(self, client):
self.client = client
self.update.start()
self.schedule_time = datetime.strptime("2020-11-10 7:00:00", '%Y-%m-%d %H:%M:%S')
while self.schedule_time <= datetime.now():
self.schedule_time += timedelta(hours=12)
# self.schedule_time += timedelta(hours=-12) # turn this on to show deadlines on bot reset
@commands.command()
@commands.has_permissions(administrator=True)
async def mess(self, ctx, amount=1):
try:
update_database(ctx)
no_edu0 = False
no_edu1 = False
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu.json", "r") as f:
edu = json.load(f)
edu = edu[str(ctx.guild.id)]
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu0.json", "r") as f:
try:
edu0 = json.load(f)
edu0 = edu0[str(ctx.guild.id)]
if len(edu0.keys()) == 0:
raise Exception("nothing inside")
except:
no_edu0 = True
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu1.json", "r") as f:
try:
edu1 = json.load(f)
edu1 = edu1[str(ctx.guild.id)]
if len(edu1.keys()) == 0:
raise Exception("nothing inside")
except:
no_edu1 = True
# going over edu
messages = edu['timelineItems']
to_show = []
for message in messages:
if message["typ"] == "sprava":
to_show.append(message)
# going over edu0
to_show0 = []
if no_edu0 is False:
messages = edu0['timelineItems']
for message in messages:
if message["typ"] == "sprava":
to_show0.append(message)
# going over edu1
to_show1 = []
if no_edu1 is False:
messages = edu1['timelineItems']
for message in messages:
if message["typ"] == "sprava":
to_show1.append(message)
# cutting the files to required size
while len(to_show) > int(amount):
del to_show[-1]
if no_edu0 is False:
while len(to_show0) > int(amount):
del to_show0[-1]
if no_edu1 is False:
while len(to_show1) > int(amount):
del to_show1[-1]
# merging them together
merged = merge(to_show, to_show0, to_show1)
while len(merged) > int(amount):
del merged[-1]
# displaying
for message in merged:
try:
await ctx.send(f"```{message['cas_pridania']} {message['user_meno']}\n"
f"{message['vlastnik_meno']}: {message['text']}```")
except:
mess = discord.Embed(title="Message",
description=f"{message['user_meno']}")
mess.add_field(name=f"{message['vlastnik_meno']}:",
value=f"text way to long, will be displayed as string")
await ctx.send(content=None, embed=mess)
# copying code from another bot i made
message_content = message["text"].split("\n")
lengths = list(map(len, message_content))
cur_length = lengths[0]
low = 0
for i in range(1, len(lengths)):
if cur_length + lengths[i] > 1700: # space for 204 \n
send_string = '\n'.join(message_content[low:i])
try:
await ctx.send(f"```{send_string}```")
except:
pass
low = i
cur_length = 0
cur_length += lengths[i]
except Exception as e:
with open("/home/dietpi/Edu-kun_v.2.0/saves/error_log.txt", "w+") as f:
f.write(str(e))
f.close()
@commands.command()
@commands.has_permissions(administrator=True)
async def homework(self, ctx, amount=1):
try:
update_database(ctx)
no_edu0 = False
no_edu1 = False
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu.json", "r") as f:
edu = json.load(f)
edu = edu[str(ctx.guild.id)]
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu0.json", "r") as f:
try:
edu0 = json.load(f)
edu0 = edu0[str(ctx.guild.id)]
if len(edu0.keys()) == 0:
raise Exception("nothing inside")
except:
no_edu0 = True
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu1.json", "r") as f:
try:
edu1 = json.load(f)
edu1 = edu1[str(ctx.guild.id)]
if len(edu1.keys()) == 0:
raise Exception("nothing inside")
except:
no_edu1 = True
# going over edu
messages = edu['homeworks']
to_show = []
for message in messages:
to_show.append(message)
# going over edu0
to_show0 = []
if no_edu0 is False:
messages = edu0['homeworks']
for message in messages:
to_show0.append(message)
# going over edu1
to_show1 = []
if no_edu1 is False:
messages = edu1['homeworks']
for message in messages:
to_show1.append(message)
# cutting the files to required size
while len(to_show) > int(amount):
del to_show[-1]
if no_edu0 is False:
while len(to_show0) > int(amount):
del to_show0[-1]
if no_edu1 is False:
while len(to_show1) > int(amount):
del to_show1[-1]
# merging them together
merged = merge(to_show, to_show0, to_show1)
while len(merged) > int(amount):
del merged[-1]
for message in merged:
try:
await ctx.send(f"```{message['datecreated']} {message['autor_meno']}\n"
f"predmet: {message['predmet_meno']}:\n"
f"text: {message['name']}\n"
f"deadline: {message['datetimeto']}```")
except:
await ctx.send(f"```{message['datecreated']} {message['autor_meno']}\n"
f"predmet: {message['predmet_meno']}:\n"
f"text: {message['name']}\n"
f"deadline: {message['dateto']}```")
except Exception as e:
with open("/home/dietpi/Edu-kun_v.2.0/saves/error_log.txt", "w+") as f:
f.write(str(e))
f.close()
@commands.command()
@commands.has_permissions(administrator=True)
async def new(self, ctx): # not always context cause automation sometimes only channel is passed
update_database(ctx)
no_edu0 = False
no_edu1 = False
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu.json", "r") as f:
edu = json.load(f)
edu = edu[str(ctx.guild.id)]
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu0.json", "r") as f:
try:
edu0 = json.load(f)
edu0 = edu0[str(ctx.guild.id)]
if len(edu0.keys()) == 0:
raise Exception("nothing inside")
except:
no_edu0 = True
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu1.json", "r") as f:
try:
edu1 = json.load(f)
edu1 = edu1[str(ctx.guild.id)]
if len(edu1.keys()) == 0:
raise Exception("nothing inside")
except:
no_edu1 = True
with open("/home/dietpi/Edu-kun_v.2.0/saves/old.json", "r") as f:
oldMain = json.load(f)
old = oldMain[str(ctx.guild.id)]
new_e_superids = []
new_timelineids = []
# handling homework
messages = edu['homeworks']
to_show = []
for message in messages:
try:
if message["e_superid"] not in old["homework"].keys():
to_show.append(message)
new_e_superids.append(message["e_superid"])
else:
pass
except:
pass
to_show0 = []
if no_edu0 is False:
messages = edu0['homeworks']
for message in messages:
try:
if message["e_superid"] not in old["homework"].keys():
if message["e_superid"] not in new_e_superids:
new_e_superids.append(message["e_superid"])
to_show0.append(message)
else:
pass
except:
pass
to_show1 = []
if no_edu1 is False:
messages = edu1['homeworks']
for message in messages:
try:
if message["e_superid"] not in old["homework"].keys():
if message["e_superid"] not in new_e_superids:
new_e_superids.append(message["e_superid"])
to_show1.append(message)
else:
pass
except:
pass
# merged = merge(to_show, to_show0, to_show1)
merged = to_show1 + to_show0 + to_show
# displaying
if merged:
for message in merged:
try:
homework = discord.Embed(title=f"Homework",
description=f"{message['datecreated']} - {message['autor_meno']}")
homework.add_field(name=f"Subject:",
value=f"{message['predmet_meno']}")
homework.add_field(name=f"Text:",
value=f"{message['name']}")
homework.add_field(name=f"Deadline:",
value=f"{message['datetimeto']}")
await ctx.send(content=None, embed=homework)
except:
homework = discord.Embed(title=f"Homework",
description=f"{message['datecreated']} - {message['autor_meno']}")
homework.add_field(name=f"Subject:",
value=f"{message['predmet_meno']}")
homework.add_field(name=f"Text:",
value=f"{message['name']}")
homework.add_field(name=f"Deadline:",
value=f"{message['dateto']}")
await ctx.send(content=None, embed=homework)
# handling messages
# getting client names to remove private messages
with open("/home/dietpi/Edu-kun_v.2.0/saves/accounts.json", "r") as f:
accounts = json.load(f)
accounts = accounts[str(ctx.guild.id)]
names = [accounts[x]["name"] for x in accounts.keys()]
for name in range(len(names)):
i = 0
li = 0
for char in names[name]:
if char in string.ascii_uppercase:
i += 1
if i == 2:
names[name] = f"{names[name][:li]} {names[name][li:]}"
li += 1
# getting names to filter from database
with open("/home/dietpi/Edu-kun_v.2.0/saves/names.json", "r") as f:
namesX = json.load(f)
try:
names += namesX[str(ctx.guild.id)]
except:
pass
# looking for messages
to_show = []
messages = edu["timelineItems"]
for message in messages:
if message["timelineid"] not in old['messages'].keys():
if message['typ'] == "sprava":
if message["user_meno"] not in names:
to_show.append(message)
new_timelineids.append(message["timelineid"])
else:
pass
to_show0 = []
if no_edu0 is False:
messages = edu0["timelineItems"]
for message in messages:
if message["timelineid"] not in old['messages'].keys():
if message["timelineid"] not in new_timelineids:
if message['typ'] == "sprava":
if message["user_meno"] not in names:
to_show0.append(message)
new_timelineids.append(message["timelineid"])
else:
pass
to_show1 = []
if no_edu1 is False:
messages = edu1["timelineItems"]
for message in messages:
if message["timelineid"] not in old['messages'].keys():
if message["timelineid"] not in new_timelineids:
if message['typ'] == "sprava":
if message["user_meno"] not in names:
to_show1.append(message)
new_timelineids.append(message["timelineid"])
else:
pass
# merged = merge(to_show, to_show0, to_show1)
merged = to_show1 + to_show0 + to_show
# displaying
if merged:
for message in merged:
try:
mess = discord.Embed(title="Message",
description=f"{message['user_meno']}")
mess.add_field(name=f"{message['vlastnik_meno']}:",
value=f"{message['text']}")
await ctx.send(content=None, embed=mess)
except:
mess = discord.Embed(title="Message",
description=f"{message['user_meno']}")
mess.add_field(name=f"{message['vlastnik_meno']}:",
value=f"text way to long, will be displayed as string")
await ctx.send(content=None, embed=mess)
# copying code from another bot i made
message_content = message["text"].split("\n")
lengths = list(map(len, message_content))
if sum(lengths) <= 1700:
await ctx.send(f"```{message['text']}```")
cur_length = lengths[0]
low = 0
for i in range(1, len(lengths)):
if cur_length + lengths[i] > 1700: # space for 204 \n
send_string = '\n'.join(message_content[low:i])
try:
await ctx.send(f"```{send_string}```")
except:
pass
low = i
cur_length = 0
cur_length += lengths[i]
# appending new messages to old ones
for iD in new_e_superids:
old["homework"][iD] = iD
for iD in new_timelineids:
old["messages"][iD] = iD
oldMain[str(ctx.guild.id)] = old
with open("/home/dietpi/Edu-kun_v.2.0/saves/old.json", "w") as f:
json.dump(oldMain, f, indent=4)
@commands.command()
@commands.has_permissions(administrator=True)
async def deadline(self, ctx):
try:
no_edu0 = False
no_edu1 = False
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu.json", "r") as f:
edu = json.load(f)
edu = edu[str(ctx.guild.id)]
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu0.json", "r") as f:
try:
edu0 = json.load(f)
edu0 = edu0[str(ctx.guild.id)]
if len(edu0.keys()) == 0:
raise Exception("nothing inside")
except:
no_edu0 = True
with open("/home/dietpi/Edu-kun_v.2.0/saves/edu1.json", "r") as f:
try:
edu1 = json.load(f)
edu1 = edu1[str(ctx.guild.id)]
if len(edu1.keys()) == 0:
raise Exception("nothing inside")
except:
no_edu1 = True
edu = edu["homeworks"]
if no_edu0 is False:
edu0 = edu0["homeworks"]
else:
edu0 = []
if no_edu1 is False:
edu1 = edu1["homeworks"]
else:
edu1 = []
merged = merge(edu, edu0, edu1)
for message in merged:
try:
x = datetime.strptime(message["datetimeto"], '%Y-%m-%d %H:%M:%S')
except:
x = datetime.strptime(message["dateto"], '%Y-%m-%d')
if datetime.now() + timedelta(days=1) > x > datetime.now():
try:
homework = discord.Embed(title=f"!!!DEADLINE!!!",
description=f"{message['datecreated']} - {message['autor_meno']}")
homework.add_field(name=f"Subject:",
value=f"{message['predmet_meno']}")
homework.add_field(name=f"Text:",
value=f"{message['name']}")
homework.add_field(name=f"Deadline:",
value=f"{message['datetimeto']}")
await ctx.send(content=None, embed=homework)
except:
homework = discord.Embed(title="!!!DEADLINE!!!",
description=f"{message['datecreated']} - {message['autor_meno']}")
homework.add_field(name=f"Subject:",
value=f"{message['predmet_meno']}")
homework.add_field(name=f"Text:",
value=f"{message['name']}")
homework.add_field(name=f"Deadline:",
value=f"{message['dateto']}")
await ctx.send(content=None, embed=homework)
except Exception as e:
with open("/home/dietpi/Edu-kun_v.2.0/saves/error_log.txt", "w+") as f:
f.write(str(e))
f.close()
@tasks.loop(seconds=120.0)
async def update(self):
print("time for cycle")
with open("/home/dietpi/Edu-kun_v.2.0/saves/setup.json", "r") as f:
setupX = json.load(f)
try:
with open("/home/dietpi/Edu-kun_v.2.0/saves/channels.json", "r") as f:
channels = json.load(f)
for server in self.client.guilds:
try:
for channel in server.channels:
if channel.name == channels[str(server.id)]:
await self.new(channel)
except Exception as e:
if setupX[str(server.id)]['debug']:
await server.channels[-1].send("A problem has occurred.")
with open("/home/dietpi/Edu-kun_v.2.0/saves/error_log.txt", "w+") as f:
f.write(str(e))
f.close()
now = datetime.now()
if self.schedule_time <= now:
for server in self.client.guilds:
try:
for channel in server.channels:
if channel.name == channels[str(server.id)]:
await self.deadline(channel)
except:
if setupX[str(server.id)]['debug']:
await server.channels[-1].send("A problem has occurred.")
self.schedule_time += timedelta(hours=12)
except Exception as e:
with open("/home/dietpi/Edu-kun_v.2.0/saves/error_log.txt", "w+") as f:
f.write(str(e))
f.close()
def update_database(ctx):
# getting accounts
with open("/home/dietpi/Edu-kun_v.2.0/saves/accounts.json") as f:
accounts = json.load(f)[str(ctx.guild.id)]
for account in accounts.keys():
for i in range(6):
try:
url = 'https://spspb.edupage.org/login/edubarLogin.php'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"}
values = {'username': f"{accounts[account]['name']}",
'password': f"{weird_shuffle(accounts[account]['password'])}"}
if values['username'] == "JakubDuris":
pass
edupage = requests.session()
edupage.post(url, data=values, headers=headers)
r = edupage.get("https://spspb.edupage.org/timeline/", headers=headers)
x = r.text.split("\n")
lines_to_del = []
if values['username'] == "JakubDuris":
pass
for line in x:
if len(line) < 10000:
lines_to_del.append(line)
for line in lines_to_del:
del x[x.index(line)]
if values['username'] == "JakubDuris":
pass
x = list(x[0])
while x[0] != "{":
del x[0]
while x[-1] != "}":
del x[-1]
x = "".join(x)
x = x.replace("false", "False").replace("true", "True").replace("null", "None")
var = eval(x)
if values['username'] == "JakubDuris":
pass
with open(f"/home/dietpi/Edu-kun_v.2.0/saves/{accounts[account]['file']}", "r") as f:
save = json.load(f)
save[str(ctx.guild.id)] = var
with open(f"/home/dietpi/Edu-kun_v.2.0/saves/{accounts[account]['file']}", "w") as f:
json.dump(save, f, indent=4)
break
except Exception as e:
time.sleep(0.5)
print(accounts[account]['name'])
print(str(e))
def merge(list0, list1, *args):
try:
if list0[0]['typ'] == "sprava":
l0 = [[datetime.strptime(item['cas_pridania'], '%Y-%m-%d %H:%M:%S'), item] for item in list0]
l1 = [[datetime.strptime(item['cas_pridania'], '%Y-%m-%d %H:%M:%S'), item] for item in list1]
else:
raise Exception
except:
l0 = [[datetime.strptime(item['datecreated'], '%Y-%m-%d %H:%M:%S'), item] for item in list0]
l1 = [[datetime.strptime(item['datecreated'], '%Y-%m-%d %H:%M:%S'), item] for item in list1]
l2 = l0 + l1
merged = copy.deepcopy(l2)
# remove duplicates
merged = unduplicate(merged)
skip = False
if len(merged) < 2:
skip = True
if skip is False:
for i in range(1, len(merged)):
while merged[i][0] < merged[i-1][0] and i > 0:
c = merged[i]
merged[i] = merged[i-1]
merged[i-1] = c
i -= 1
merged.reverse()
merged = [item[1] for item in merged]
if len(args) > 0:
for li in args:
merged = merge(merged, li)
return merged
def unduplicate(listX):
for item in listX:
l3 = copy.copy(listX)
l3.remove(item)
for itemX in l3:
if item[0] == itemX[0]:
listX = unduplicate(l3)
return listX
return listX
def weird_shuffle(message):
x = message
o = []
e = []
ind = []
gug = 0
for i in x:
o.append(i)
f = len(x) / 2
if f % 1 == 0:
o.append(" ")
gug = 1
p = len(o)
for u in range(0, p):
ind.append(u)
for ef in range(0, p):
if max(ind) - ef * 2 < 0:
break
e.append(o[max(ind) - ef * 2])
if min(ind) + 1 + (ef * 2) > max(ind):
break
e.append(o[min(ind) + 1 + (ef * 2)])
zet = ["", p]
if gug == 1:
e.remove(e[0])
zet[0] = " "
zet[1] = p - 1
gug = ""
for ups in range(0, zet[1]):
gug += e[ups]
return zet[0] + gug
def setup(client):
client.add_cog(Edupage(client))