This is a quart api for querying data related to study together.
Setup redis and mysql with fake data.
- Mariadb
Install and start mariadb.
Create a studytogether database:
# create studytogether database
CREATE DATABASE studytogetherCreate a user with access to the studytogether database:
$ mysql -u root -p
MariaDB> CREATE USER 'study'@'localhost' IDENTIFIED BY 'study_pass';
MariaDB> GRANT ALL PRIVILEGES ON studytogether.* TO 'study'@'localhost';
MariaDB> FLUSH PRIVILEGES;
MariaDB> quit
- Redis
Install and start redis.
- Populate dev.env
# Copy example to dev.env and populate it 
cp dev.env.example dev.env- Insert fake data
This will run migrations and then insert fake data into the mysql and redis dbs (warning this will reset the dbs).
# install dependencies
pipenv install
# activate the environment
pipenv shell
# run insert_fake_data
python insert_fake_data.py- Start the Api
This will start the quart api on port 5000.
# activate the environment
pipenv shell
# start the bot
python bot.py & 
# start the quart api
python app.pyIn order to use queries you need to use the id of a valid user. You can get a valid id as follows:
$ mysql -u study -p
MariaDB> USE studytogether;
MariaDB> SELECT * FROM user LIMIT 10;There are four main queries:
Return a list of matching users and their userids.
Takes a param for match. The list of users will be searched by the glob f"*{match}".
Example call:
http://localhost:5000/users?match=cole
Example response:
[
    {
        "discord_user_id": "619663424812613662",
        "tag": "#3088",
        "username": "Cole Killian"
    },
    {
        "discord_user_id": "294865385780412416",
        "tag": "#8220",
        "username": "Coleman"
    },
    {
        "discord_user_id": "687847542041608192",
        "tag": "#4048",
        "username": "Cole Fluet"
    },
    {
        "discord_user_id": "400866823643332608",
        "tag": "#0711",
        "username": "coleus"
    },
    {
        "discord_user_id": "254251545837699072",
        "tag": "#4408",
        "username": "Colean"
    }
]
Returns leaderboard information on a time interval and the number of users in the server.
Takes params for offset, limit, and time_interval. Time interval must be one of "pastDay", "pastWeek", "pastMonth", "allTime".
Example call:
http://localhost:5000/leaderboard?offset=0&limit=5&time_interval=pastWeek
Example response:
{
    "leaderboard": [
        {
            "discord_user_id": "724579964007219221",
            "rank": 1,
            "study_time": 112,
            "username": "saberscientist"
        },
        {
            "discord_user_id": "716376818072027167",
            "rank": 2,
            "study_time": 112,
            "username": "Bot of Discord"
        },
        {
            "discord_user_id": "708711987911065663",
            "rank": 3,
            "study_time": 112,
            "username": "Sadaf"
        },
        {
            "discord_user_id": "683017009889411242",
            "rank": 4,
            "study_time": 112,
            "username": "Discord User"
        },
        {
            "discord_user_id": "578536678961053716",
            "rank": 5,
            "study_time": 112,
            "username": "reedo"
        },
        {
            "discord_user_id": "494580308415348754",
            "rank": 6,
            "study_time": 112,
            "username": "Unturneddaddy"
        }
    ],
    "num_users": 30625
}
Returns general information about a user.
Takes url args for user_id.
Example call:
http://localhost:5000/userstats/619663424812613662
Example response:
{
    "roleInfo": {
        "next_role": {
            "hours": "220-350",
            "id": 676158518956654612,
            "mention": "<@&792781265547821089>",
            "name": "study master (220-350h+)"
        },
        "role": {
            "hours": "160-220",
            "id": 674297907150716959,
            "mention": "<@&792781265547821088>",
            "name": "study-machine (160-220h)"
        },
        "time_to_next_role": 44.3
    },
    "stats": {
        "allTime": {
            "rank": 18463,
            "study_time": 175.7
        },
        "average_per_day": 7.321,
        "currentStreak": 3,
        "longestStreak": 5,
        "pastDay": {
            "rank": 6461,
            "study_time": 12.6
        },
        "pastMonth": {
            "rank": 18463,
            "study_time": 175.7
        },
        "pastWeek": {
            "rank": 19701,
            "study_time": 40
        }
    },
    "username": "Cole Killian"
}
Returns time series data about a users study hours, and a list of neighbors.
Takes url args for user_id, and params for time_interval. Time interval must be one of "pastDay", "pastWeek", "pastMonth", "allTime".
Example call:
http://localhost:5000/usertimeseries/619663424812613662?time_interval=pastWeek
Example response:
{
    "neighbors": [
        {
            "discord_user_id": "135465783089168384",
            "rank": 19696,
            "study_time": 40.1,
            "username": "bboc"
        },
        {
            "discord_user_id": "758651227302526976",
            "rank": 19697,
            "study_time": 40,
            "username": "wilbur | offline | exams"
        },
        {
            "discord_user_id": "754617725225140234",
            "rank": 19698,
            "study_time": 40,
            "username": "Synrr."
        },
        {
            "discord_user_id": "753854331500888154",
            "rank": 19699,
            "study_time": 40,
            "username": "Gangu"
        },
        {
            "discord_user_id": "707024839159971841",
            "rank": 19700,
            "study_time": 40,
            "username": "Cupica"
        },
        {
            "discord_user_id": "619663424812613662",
            "rank": 19701,
            "study_time": 40,
            "username": "Cole Killian"
        },
        {
            "discord_user_id": "519275513156730927",
            "rank": 19702,
            "study_time": 40,
            "username": "r33nter"
        },
        {
            "discord_user_id": "494498561099300865",
            "rank": 19703,
            "study_time": 40,
            "username": "rozetup"
        },
        {
            "discord_user_id": "476099239848575007",
            "rank": 19704,
            "study_time": 40,
            "username": "sudo rm -rf / --no-preserve-root"
        },
        {
            "discord_user_id": "471181139093094400",
            "rank": 19705,
            "study_time": 40,
            "username": "🌸⌬天桜(あまざくら).py☭"
        },
        {
            "discord_user_id": "467451098735837186",
            "rank": 19706,
            "study_time": 40,
            "username": "CaptainVietnam6"
        }
    ],
    "timeseries": [
        {
            "date": "2021-03-17",
            "rank": 17100,
            "study_time": 7
        },
        {
            "date": "2021-03-18",
            "rank": 18619,
            "study_time": 6.3
        },
        {
            "date": "2021-03-19",
            "rank": 3467,
            "study_time": 14.2
        },
        {
            "date": "2021-03-20",
            "rank": 8618,
            "study_time": 11.5
        },
        {
            "date": "2021-03-21",
            "rank": 17356,
            "study_time": 6.8
        },
        {
            "date": "2021-03-22",
            "rank": 24330,
            "study_time": 3.2
        },
        {
            "date": "2021-03-23",
            "rank": 6461,
            "study_time": 12.6
        }
    ]
}