234 lines
6.9 KiB
Python
234 lines
6.9 KiB
Python
import asyncio
|
|
from bot.helper.ignouresult import IgnouResult
|
|
from bot.database import Database
|
|
from bot.helper.extractor import Student
|
|
import datetime
|
|
import time
|
|
|
|
from pyrogram import Client
|
|
from pyrogram.errors import FloodWait,PeerIdInvalid
|
|
|
|
db = Database()
|
|
|
|
|
|
class IgnouCrawler:
|
|
|
|
def __init__(self,client) -> None:
|
|
|
|
self.db = db
|
|
self.client = client
|
|
|
|
self.greeted = {
|
|
"grade" : {},
|
|
"tee" : {}
|
|
}
|
|
self.greet_msg = {
|
|
"grade" : "Grade Card Updated Today ",
|
|
"tee" : "One more result out Today 🤒"
|
|
}
|
|
|
|
self.todayDate = datetime.datetime.today().strftime('%B %d, %Y')
|
|
|
|
async def greet_user(self, result_type, user_id):
|
|
|
|
if not self.greeted.get(result_type).get(user_id):
|
|
self.greeted[result_type][user_id] = True
|
|
try:
|
|
await self.client.send_message(
|
|
user_id,
|
|
f"<b>{self.greet_msg.get(result_type)}👩🏻🎨</b>",parse_mode='html')
|
|
except FloodWait as e:
|
|
time.sleep(e.x)
|
|
await self.client.send_message(
|
|
user_id,
|
|
f"<b>{self.greet_msg.get(result_type)}👩🏻🎨</b>",parse_mode='html')
|
|
except PeerIdInvalid as e:
|
|
print(f"{user_id} -> {e}")
|
|
|
|
async def teeCrawl(self, student: Student):
|
|
|
|
data = IgnouResult('roshan'+ student._id).teeResultString()
|
|
|
|
if data and student.tee.count != data.get("count"):
|
|
|
|
title = '<pre>' + f'Name : {student.name} -> {student.course}\n' + '</pre>'
|
|
|
|
for user_id in student.followers:
|
|
|
|
if not self.greeted.get("tee").get(user_id):
|
|
await self.greet_user("tee", user_id)
|
|
|
|
try:
|
|
await self.client.send_message(
|
|
chat_id=user_id,
|
|
text= title + data.get("result"),
|
|
parse_mode='html')
|
|
|
|
except FloodWait as e:
|
|
time.sleep(e.x)
|
|
await self.client.send_message(
|
|
chat_id=user_id,
|
|
text= title + data.get("result"),
|
|
parse_mode='html')
|
|
except PeerIdInvalid as e:
|
|
print(f"{user_id} -> {e}")
|
|
|
|
await self.db.update(
|
|
self.db.crawler,
|
|
student._id,
|
|
{
|
|
"$set": {
|
|
"tee.count": data.get("count"),
|
|
"tee.checked": self.todayDate
|
|
}
|
|
}
|
|
)
|
|
|
|
async def teeTask(self):
|
|
|
|
print("Tee Result Crawling : {}".format(datetime.datetime.today().strftime("%d/%m/%Y %H:%M:%S")))
|
|
|
|
await self.db.update(
|
|
self.db.site,
|
|
"ignou",
|
|
{
|
|
"$set" : {
|
|
"tee_checked": datetime.datetime.today().strftime("%d/%m/%Y %H:%M:%S")
|
|
}
|
|
}
|
|
)
|
|
|
|
tasks = []
|
|
|
|
students = await db.get_all_crawlers()
|
|
self.greeted['tee'] = {}
|
|
|
|
# Check first TEE SIte Updated or not
|
|
site = await IgnouResult().teeCardUpdated()
|
|
if not site.get("updated"):
|
|
# print("Tee card Site not Updated")
|
|
return
|
|
|
|
# if site updated check for results
|
|
async for student in students:
|
|
student_info = Student(student)
|
|
|
|
if student_info.tee.checked == self.todayDate:
|
|
continue
|
|
|
|
tasks.append(
|
|
asyncio.create_task(
|
|
self.teeCrawl(student_info)
|
|
)
|
|
)
|
|
|
|
await asyncio.gather(*tasks)
|
|
|
|
await self.db.update(
|
|
self.db.site,
|
|
"ignou",
|
|
{
|
|
"$set" : {
|
|
"tee" : site.get("date"),
|
|
"tee_checked": datetime.datetime.today().strftime("%d/%m/%Y %H:%M:%S")
|
|
}
|
|
}
|
|
)
|
|
|
|
async def gradeCrawl(self,student: Student):
|
|
|
|
data = IgnouResult(student.course + student._id).gradeResultString()
|
|
|
|
grade_passed = data.get("json", {}).get("count", {}).get("passed", 0)
|
|
grade_failed = data.get("json", {}).get("count", {}).get("failed", 0)
|
|
|
|
if data and (int(student.grade.passed) != grade_passed or int(student.grade.failed) != grade_failed) or True:
|
|
|
|
for user_id in student.followers:
|
|
|
|
if not self.greeted.get("grade").get(user_id):
|
|
await self.greet_user("grade", user_id)
|
|
|
|
try:
|
|
await self.client.send_message(
|
|
chat_id= user_id,
|
|
text = data.get("result"),
|
|
parse_mode ='html')
|
|
|
|
except FloodWait as e:
|
|
time.sleep(e.x)
|
|
await self.client.send_message(
|
|
chat_id= user_id,
|
|
text = data.get("result"),
|
|
parse_mode ='html')
|
|
except PeerIdInvalid as e:
|
|
print(f"{user_id} -> {e}")
|
|
|
|
await self.db.update(
|
|
self.db.crawler,
|
|
student._id,
|
|
{
|
|
"$set" : {
|
|
"grade.count.passed": grade_passed,
|
|
"grade.count.failed": grade_failed,
|
|
"grade.checked": self.todayDate
|
|
}
|
|
}
|
|
)
|
|
|
|
async def gradeTask(self):
|
|
print("Grade Card Crawling : {}".format(datetime.datetime.today().strftime("%d/%m/%Y %H:%M:%S")))
|
|
|
|
await self.db.update(
|
|
self.db.site,
|
|
"ignou",
|
|
{
|
|
"$set": {
|
|
"grade_checked": datetime.datetime.today().strftime("%d/%m/%Y %H:%M:%S")
|
|
}
|
|
}
|
|
)
|
|
|
|
tasks = []
|
|
|
|
students = await db.get_all_crawlers()
|
|
self.greeted['grade'] = {}
|
|
|
|
# Check first Grade Site Updated or not
|
|
site = await IgnouResult().gradeCardUpdated()
|
|
if not site.get("updated"):
|
|
# print("Grade card Site not Updated")
|
|
return
|
|
|
|
# if site updated check for results
|
|
|
|
async for student in students:
|
|
student_info = Student(student)
|
|
|
|
if student_info.grade.checked == self.todayDate:
|
|
continue
|
|
|
|
tasks.append(
|
|
asyncio.create_task(
|
|
self.gradeCrawl(student_info)
|
|
)
|
|
)
|
|
|
|
await asyncio.gather(*tasks)
|
|
|
|
await self.db.update(
|
|
self.db.site,
|
|
"ignou",
|
|
{
|
|
"$set" : {
|
|
"grade": site.get("date"),
|
|
"grade_checked": datetime.datetime.today().strftime("%d/%m/%Y %H:%M:%S")
|
|
}
|
|
}
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pass
|
|
|