Exemplo n.º 1
0
    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))
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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>.")
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
def send_error_bad_request(conn):
    send_error(conn, HttpError(404))