Esempio n. 1
0
async def display_diff(db: DatabaseManager, id_discord_server: int, username1: str, username2: str) \
        -> List[Dict[str, Optional[str]]]:
    if not await db.user_exists(id_discord_server, username1):
        tosend = f'User {username1} is not in team.'
        tosend_list = [{'user': username1, 'msg': tosend}]
        return tosend_list
    if not await db.user_exists(id_discord_server, username2):
        tosend = f'User {username2} is not in team.'
        tosend_list = [{'user': username2, 'msg': tosend}]
        return tosend_list

    database_users = await db.select_users(id_discord_server)
    user1 = db.find_user(database_users, id_discord_server, username1)
    user2 = db.find_user(database_users, id_discord_server, username2)
    solved_user1 = await get_solved_challenges(user1['rootme_user_id'])
    solved_user1 = sorted(solved_user1, key=lambda x: x['date'])  # sort challenge solved by date
    solved_user2 = await get_solved_challenges(user2['rootme_user_id'])
    solved_user2 = sorted(solved_user2, key=lambda x: x['date'])  # sort challenge solved by date

    user1_diff, user2_diff = get_diff(solved_user1, solved_user2)
    tosend_list = []

    tosend = await display_diff_one_side(user1_diff)
    tosend_list.append({'user': username1, 'msg': tosend})
    tosend = await display_diff_one_side(user2_diff)
    tosend_list.append({'user': username2, 'msg': tosend})
    return tosend_list
Esempio n. 2
0
async def display_duration(db: DatabaseManager, context: Context, args: Tuple[str], delay: timedelta) \
        -> List[Dict[str, Optional[str]]]:
    database_users = await db.select_users(context.guild.id)
    if len(args) == 1:
        if not await db.user_exists(context.guild.id, args[0]):
            tosend = f'User {args[0]} is not in team.'
            tosend_list = [{'user': args[0], 'msg': tosend}]
            return tosend_list
        else:
            username = args[0]
            users = [db.find_user(database_users, context.guild.id, username)]
    else:
        users = await db.select_users(context.guild.id)

    now = datetime.now()
    tosend_list = []
    for user in users:
        user_info = await Parser.extract_rootme_profile_complete(
            user["rootme_user_id"])
        if user_info is None:  #  User {user["rootme_username"]} score is equal to zero
            continue
        challenges_solved = user_info['validations']
        challenges_solved = sorted(challenges_solved,
                                   key=lambda x: x['date'],
                                   reverse=True)

        tosend = ''
        for challenge in challenges_solved:
            date = datetime.strptime(challenge['date'], "%Y-%m-%d %H:%M:%S")
            diff = now - date
            if diff >= delay:
                continue
            challenge_info = await Parser.extract_challenge_info(
                challenge['id_challenge'])
            tosend += f' • {unescape(challenge_info["titre"])} ({challenge_info["score"]} points) - {challenge["date"]}\n'
        tosend_list.append({'user': user, 'msg': tosend})

    test = [item['msg'] == '' for item in tosend_list]
    if len(users) == 1 and False not in test:
        tosend = f'No challenges solved by {users[0]["rootme_username"]} :frowning:'
        tosend_list = [{'user': None, 'msg': tosend}]
    elif False not in test:
        tosend = 'No challenges solved by anyone :frowning:'
        tosend_list = [{'user': None, 'msg': tosend}]

    return tosend_list
Esempio n. 3
0
async def display_diff_with(db: DatabaseManager, id_discord_server: int, bot: Bot, selected_username: str):
    if not await db.user_exists(id_discord_server, selected_username):
        tosend = f'User {selected_username} is not in team.'
        tosend_list = [{'user': selected_username, 'msg': tosend}]
        return tosend_list

    tosend_list = []
    users = await db.select_users(id_discord_server)
    selected_user = db.find_user(users, id_discord_server, selected_username)
    solved_user_select = await get_solved_challenges(selected_user['rootme_user_id'])

    for user in users:
        solved_user = await get_solved_challenges(user['rootme_user_id'])
        user_diff, user_diff_select = get_diff(solved_user, solved_user_select)
        if user_diff:
            tosend = await display_diff_one_side(user_diff)
            tosend_list.append({'user': user["rootme_username"], 'msg': tosend})
    return tosend_list
Esempio n. 4
0
            """ """
            await disp.reset_database(db, context)

    def start(self):
        if token == 'token':
            red('Please update your token in ./bot/constants.py')
            sys.exit(0)
        self.catch()
        self.bot.loop.create_task(self.cron())
        self.bot.run(token)


def init_rootme_challenges():
    rootme_challenges = {}
    for lang in LANGS:
        loop = asyncio.get_event_loop()  # event loop
        future = asyncio.ensure_future(get_categories(lang))  # tasks to do
        challenges = loop.run_until_complete(future)  # loop until done
        rootme_challenges[lang] = challenges
    return rootme_challenges


if __name__ == "__main__":
    rootme_challenges = init_rootme_challenges()
    if rootme_challenges is None:
        red('Cannot fetch RootMe challenges from the API.')
        sys.exit(0)
    db = DatabaseManager(FILENAME, rootme_challenges)
    bot = RootMeBot(db)
    bot.start()