async def _clanmembers(self, ctx, tag): tag = tag[1:] url = f"{tokens.CLASH_API_URL}clans/%23{tag}" response = requests.get(url=url, headers=headers) try: c = response.json() if response.status_code != 200: raise HttpError(response.status_code, c['reason'], tag) except HttpError as he: await ctx.send(he) return await ctx.send(f"_Listing members in clan **{c['name']}**..._\n") cm = c['memberList'] # Divide output into messages with 10 entries to circumvent Discord's message length limit message = "" i = 0 while i < len(cm): player = cm[i] role = get_player_role(player) message += f"\n**{i+1}. {player['name']}** ({player['trophies']} trophies, {role}{player['tag']})" i += 1 if i % 10 == 0 or i == len(cm): await ctx.send(message) message = ""
def do_POST(self): print(self.requestline) try: if self.path == "/user": user_handler(self) elif self.path == "/registration": registration_handler(self) elif self.path == "/create_course": create_course_handler(self) elif self.path == "/courses": courses_handler(self) elif self.path == "/is_open_course": is_open_course_handler(self) elif self.path == "/open_course": open_course_handler(self) elif self.path == "/close_course": close_course_handler(self) elif self.path == "/delete_course": delete_course_handler(self) elif self.path == "/teacher_attendance": teacher_attendance_handler(self) elif self.path == "/subscribe_course": subscribe_course_handler(self) elif self.path == "/subscribe": subscribe_handler(self) elif self.path == "/unsubscribe_course": unsubscribe_course_handler(self) elif self.path == "/student_attendance": student_attendance_handler(self) else: send_error_bad_request(self) except HttpError as error: send_error(self, error) except: send_error(self, HttpError(500))
async def _players(self, ctx, tag): # Fetch player data from an API request. If the request fails, abort before handling the JSON if tag[0] == '#': tag = tag[1:] url = f"{tokens.CLASH_API_URL}players/%23{tag}" response = requests.get(url=url, headers=headers) try: p = response.json() if response.status_code != 200: raise HttpError(response.status_code, p['reason'], tag) except HttpError as he: await ctx.send(he) return # If the player is just a member, the bot won't print a role role = get_player_role(p) await ctx.send(f"_Found player **{p['name']}**:_\n") # Create embed to send embed = discord.Embed(title=p['name'], color=0xFF00FF) embed.set_thumbnail(url=p['league']['iconUrls']['small']) embed.add_field(name="Clan", value=f"{p['clan']['name']} ({role}#{tag})", inline=False) embed.add_field(name="Town Hall", value=p['townHallLevel'], inline=False) embed.add_field(name="Trophies", value=p['trophies'], inline=False) embed.add_field(name="Experience Level", value=p['expLevel'], inline=False) await ctx.send(embed=embed)
def get_user_from_request(conn): length = int(conn.headers.getheader('Content-Length')) request_data = conn.rfile.read(length) template_device_id = '(^([0-9A-F]{2}:){5}[0-9A-F]{2}$)' user = re.search(template_device_id, request_data) if user: return user.group(0) raise HttpError(404)
def create_course_handler(conn): try: course_info = get_course_info_from_request(conn) con = sql.connect('data/data.db') with con: cur = con.cursor() cur.execute("SELECT * FROM courses WHERE name='%(name)s'" % {"name": course_info["course_name"]}) course = cur.fetchall() if (course): con.commit() cur.close() send_error_with_message( conn, HttpError(404), "This course has already been created") return cur.execute( "INSERT INTO courses VALUES ('%(name)s', '%(address)s', '[]', '{}')" % { "name": course_info["course_name"], "address": course_info["device_address"] }) cur.execute("SELECT courses FROM users WHERE id='%(id)s'" % {"id": course_info["device_address"]}) courses_str = cur.fetchone()[0] courses = json.loads(courses_str) courses.append(course_info["course_name"]) cur.execute( "UPDATE users SET courses='%(courses)s' WHERE id='%(id)s'" % { "courses": json.dumps(courses), "id": course_info["device_address"] }) con.commit() cur.close() send_post_succsess(conn, "Course created") except HttpError as error: raise error
def subscribe_course_handler(conn): try: course_info = get_course_info_from_request(conn) con = sql.connect('data/data.db') with con: cur = con.cursor() cur.execute("SELECT students FROM courses WHERE name='%(name)s'" % {"name": course_info["course_name"]}) students_str = cur.fetchone() if (not students_str): con.commit() cur.close() send_error_with_message(conn, HttpError(404), "No such course") return students = ast.literal_eval(students_str[0]) cur.execute( "UPDATE courses SET students='%(students)s' WHERE name='%(name)s'" % { "students": json.dumps(students), "name": course_info["course_name"] }) cur.execute("SELECT courses FROM users WHERE id='%(id)s'" % {"id": course_info["device_address"]}) courses_str = cur.fetchone()[0] courses = ast.literal_eval(courses_str) courses.append(course_info["course_name"]) cur.execute( "UPDATE users SET courses='%(courses)s' WHERE id='%(id)s'" % { "courses": json.dumps(courses), "id": course_info["device_address"] }) con.commit() cur.close() send_post_succsess(conn, "Course subscribed") except HttpError as error: raise error
async def _clans_by_name(ctx, name): url = f"{tokens.CLASH_API_URL}clans?name={name.replace(' ', '%20')}" response = requests.get(url=url, headers=headers) try: c = response.json() if response.status_code != 200: raise HttpError(response.status_code, c['reason'], name) except HttpError as he: await ctx.send(he) return await ctx.send(f"_Fetching search results for \"{name}\"..._") search_limit = min({10, len(c['items'])}) message = "" for i in range(search_limit): clan = c['items'][i] message += f"\n**{i+1}. {clan['name']}** ({clan['members']} members, {clan['tag']})" await ctx.send(message) await ctx.send("_To get more information on one of these clans, enter_ !clans <tag>.")
async def _clans_by_tag(ctx, tag): url = f"{tokens.CLASH_API_URL}clans/%23{tag}" response = requests.get(url=url, headers=headers) try: c = response.json() if response.status_code != 200: raise HttpError(response.status_code, c['reason'], tag) except HttpError as he: await ctx.send(he) return await ctx.send(f"_Found clan **{c['name']}**:_\n") # Create embed to send embed = discord.Embed(title=c['name'], color=0xFF00FF) embed.set_thumbnail(url=c['badgeUrls']['small']) embed.add_field(name="Clan Level", value=c['clanLevel'], inline=False) embed.add_field(name="Members", value=c['members'], inline=False) embed.add_field(name="Clan Points", value=c['clanPoints'], inline=False) embed.add_field(name="Clan Versus Points", value=c['clanVersusPoints'], inline=False) embed.add_field(name="Description", value=c['description'], inline=False) await ctx.send(embed=embed)
def send_error_bad_request(conn): send_error(conn, HttpError(404))