mirror of
https://github.com/developersIndia/deviras.git
synced 2025-05-31 14:11:43 +05:30
Compare commits
58 Commits
community-
...
main
Author | SHA1 | Date | |
---|---|---|---|
3feccf6755 | |||
101b529307 | |||
e9a454fa5a | |||
345dc1016e | |||
2824227ac9 | |||
e84b1b18ae | |||
a73d956b23 | |||
bcb037076a | |||
8ceaefcce9 | |||
7237ed4e02 | |||
ea7b0e8a37 | |||
aeed19753e | |||
87cd738f3e | |||
676744cb6f | |||
3b6d74c683 | |||
282d02d000 | |||
7c90a350e9 | |||
24be5dcd82 | |||
bcd0648167 | |||
50a57664ba | |||
44d765927c | |||
069293ea5e | |||
4e26a3f764 | |||
17967c3b95 | |||
10ce6e5528 | |||
f2b11ddd21 | |||
e5b36db49f | |||
fe0c6a6a57 | |||
8c5ecda424 | |||
21fce6828b | |||
58746803ee | |||
518f650160 | |||
1dad8740e6 | |||
2df84308dd | |||
512a469fde | |||
ed2e865492 | |||
dc7a04b9b1 | |||
3b32cb1909 | |||
dc31a18089 | |||
dbe8db8816 | |||
7419fee0bd | |||
4325ecc230 | |||
e41335edc3 | |||
bd986018d2 | |||
9f0bf8bfc5 | |||
ee24bdcbf6 | |||
1c85fa5adc | |||
9cce47796f | |||
5d7700d61b | |||
e1e6dbd929 | |||
66ae6427d7 | |||
fb06e4287d | |||
6b244fa451 | |||
0d562ab223 | |||
1eba42ecd8 | |||
97e90ca32a | |||
92a5d11fbb | |||
bfe81b439d |
@ -50,6 +50,24 @@
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "LinearArray",
|
||||
"name": "LinearArray",
|
||||
"avatar_url": "https://github.com/lineararray.png",
|
||||
"profile": "https://github.com/lineararray",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Rancho-rachit",
|
||||
"name": "Rachit Agrawal",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/111473259?v=4",
|
||||
"profile": "https://rancho-rachit.github.io/",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7,
|
||||
|
59
.github/workflows/aoc.yml
vendored
59
.github/workflows/aoc.yml
vendored
@ -1,37 +1,38 @@
|
||||
name : AoC leaderboard
|
||||
name: AoC leaderboard
|
||||
|
||||
on:
|
||||
# schedule:
|
||||
# Every 2 hours”
|
||||
# - cron: '0 */2 * * *'
|
||||
workflow_dispatch:
|
||||
# schedule:
|
||||
# Run every 24 hours at 00:00 UTC
|
||||
# - cron: "0 0 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
- name: Update Learderboard
|
||||
env:
|
||||
REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
|
||||
REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
|
||||
REDDIT_PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
|
||||
REDDIT_USERNAME: ${{ secrets.REDDIT_USERNAME }}
|
||||
AOC_SESSION_COOKIE: ${{ secrets.AOC_SESSION_COOKIE }}
|
||||
AOC_LEADERBOARD_CODE: ${{ secrets.AOC_LEADERBOARD_CODE }}
|
||||
REDDIT_POST_ID: ${{ secrets.REDDIT_POST_ID }}
|
||||
run: |
|
||||
cd aoc
|
||||
python main.py
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
- name: Update Leaderboard
|
||||
env:
|
||||
REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
|
||||
REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
|
||||
REDDIT_PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
|
||||
REDDIT_USERNAME: ${{ secrets.REDDIT_USERNAME }}
|
||||
AOC_SESSION_COOKIE: ${{ secrets.AOC_SESSION_COOKIE }}
|
||||
AOC_LEADERBOARD_CODE: ${{ secrets.AOC_LEADERBOARD_CODE }}
|
||||
AOC_LEADERBOARD_REDDIT_POST_ID: ${{ secrets.AOC_LEADERBOARD_REDDIT_POST_ID }}
|
||||
AOC_YEAR: ${{ secrets.AOC_YEAR }}
|
||||
run: |
|
||||
cd aoc
|
||||
python main.py
|
||||
|
54
.github/workflows/collection-thread-updater.yml
vendored
54
.github/workflows/collection-thread-updater.yml
vendored
@ -1,35 +1,37 @@
|
||||
name : Community Threads Wiki Updater
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # This cron expression triggers the workflow every day at midnight UTC
|
||||
workflow_dispatch:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
post_url:
|
||||
description: 'The URL of the Reddit post to add'
|
||||
required: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
- name: Update Wiki
|
||||
env:
|
||||
REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
|
||||
REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
|
||||
REDDIT_PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
|
||||
REDDIT_USERNAME: ${{ secrets.REDDIT_USERNAME }}
|
||||
GIST_ID: ${{ secrets.GIST_ID }}
|
||||
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
|
||||
run: |
|
||||
cd community-threads
|
||||
python main.py
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
- name: Update Wiki
|
||||
env:
|
||||
REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
|
||||
REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
|
||||
REDDIT_PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
|
||||
REDDIT_USERNAME: ${{ secrets.REDDIT_USERNAME }}
|
||||
GIST_ID: ${{ secrets.GIST_ID }}
|
||||
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
|
||||
run: |
|
||||
cd community-threads
|
||||
python main.py ${{ github.event.inputs.post_url }}
|
35
.github/workflows/community-roundup.yml
vendored
Normal file
35
.github/workflows/community-roundup.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
name: Community Roundup
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Run at 3:25 AM UTC (8:55 AM IST) every day
|
||||
- cron: '25 3 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Create Community Roundup Post
|
||||
env:
|
||||
REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
|
||||
REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
|
||||
REDDIT_PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
|
||||
REDDIT_USERNAME: ${{ secrets.REDDIT_USERNAME }}
|
||||
GIST_ID: ${{ secrets.GIST_ID }}
|
||||
GIST_TOKEN: ${{ secrets.GIST_TOKEN }}
|
||||
run: |
|
||||
cd community-roundup
|
||||
python -m pip install --upgrade pip
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
python main.py
|
35
.github/workflows/wiki-mention.yml
vendored
Normal file
35
.github/workflows/wiki-mention.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
name : Wiki Mention Notifier
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
username:
|
||||
description: 'The username of the community member to notify'
|
||||
required: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3.10
|
||||
uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
- name: Update Wiki
|
||||
env:
|
||||
REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
|
||||
REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
|
||||
REDDIT_PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
|
||||
REDDIT_USERNAME: ${{ secrets.REDDIT_USERNAME }}
|
||||
run: |
|
||||
cd wiki-mention
|
||||
python main.py ${{ github.event.inputs.username }}
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -127,3 +127,5 @@ dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
*.csv
|
14
README.md
14
README.md
@ -2,7 +2,6 @@
|
||||
|
||||
> Bunch of scripts to automate stuff in r/developersIndia.
|
||||
|
||||
|
||||
[](https://discordapp.com/invite/MKXMSNC)
|
||||
[](https://www.reddit.com/r/developersIndia/)
|
||||
@ -22,18 +21,23 @@
|
||||
|
||||
### [community-threads](https://github.com/developersIndia/deviras/blob/main/community-threads/main.py)
|
||||
|
||||
- Used for grabbing the posts from [community threads collection](https://www.reddit.com/r/developersIndia/collection/958aef35-f9cb-414d-ab33-08bc639e47de/) and adding it to the [wiki](https://www.reddit.com/r/developersIndia/wiki/community-threads/).
|
||||
- Add a post to [community threads wiki](https://www.reddit.com/r/developersIndia/wiki/community-threads/).
|
||||
- 
|
||||
|
||||
### [job_thread](https://github.com/developersIndia/deviras/blob/main/job_thread/main.py)
|
||||
### [job-thread](https://github.com/developersIndia/deviras/blob/main/job-thread/main.py)
|
||||
|
||||
Used for creating [hiring threads](https://www.reddit.com/r/developersIndia/?f=flair_name%3A%22Hiring%22) in the subreddit that gets the job from our [job board](https://developersindia.in/job-board/).
|
||||
- Used for creating [hiring threads](https://www.reddit.com/r/developersIndia/?f=flair_name%3A%22Hiring%22) in the subreddit that gets the job from our [job board](https://developersindia.in/job-board/).
|
||||
|
||||
### [showcase-sunday](https://github.com/developersIndia/deviras/blob/main/showcase-sunday/main.py)
|
||||
|
||||
- Used for creating [Showcase Sunday Megathreads](https://www.reddit.com/r/developersIndia/search/?q=flair%3A%20Showcase%20Sunday&restrict_sr=1) posts in the subreddit.
|
||||
- 
|
||||
|
||||
### [ama-summarizer](https://github.com/developersIndia/deviras/blob/main/ama-summarizer/main.py/)
|
||||
- The Python script to help during AMAs. It generates a markdown file of questions and links of the questions the AMA guest has answered.
|
||||
|
||||
|
||||
|
||||
## Setup
|
||||
|
||||
1. Clone the repo
|
||||
@ -75,6 +79,8 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://animesh-ghosh.github.io/"><img src="https://avatars.githubusercontent.com/u/34956994?v=4?s=100" width="100px;" alt="MaDDogx"/><br /><sub><b>MaDDogx</b></sub></a><br /><a href="https://github.com/developersIndia/deviras/commits?author=Animesh-Ghosh" title="Code">💻</a> <a href="https://github.com/developersIndia/deviras/commits?author=Animesh-Ghosh" title="Tests">⚠️</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://pratham.cc"><img src="https://avatars.githubusercontent.com/u/67585967?v=4?s=100" width="100px;" alt="Pratham"/><br /><sub><b>Pratham</b></sub></a><br /><a href="https://github.com/developersIndia/deviras/commits?author=git-bruh" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://nisarga.me/"><img src="https://avatars.githubusercontent.com/u/45588772?v=4?s=100" width="100px;" alt="Nisarga Adhikary"/><br /><sub><b>Nisarga Adhikary</b></sub></a><br /><a href="https://github.com/developersIndia/deviras/commits?author=ni5arga" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lineararray"><img src="https://github.com/lineararray.png?s=100" width="100px;" alt="LinearArray"/><br /><sub><b>LinearArray</b></sub></a><br /><a href="https://github.com/developersIndia/deviras/commits?author=LinearArray" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://rancho-rachit.github.io/"><img src="https://avatars.githubusercontent.com/u/111473259?v=4?s=100" width="100px;" alt="Rachit Agrawal"/><br /><sub><b>Rachit Agrawal</b></sub></a><br /><a href="https://github.com/developersIndia/deviras/commits?author=Rancho-rachit" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
1
ama-summarizer/.gitignore
vendored
Normal file
1
ama-summarizer/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
questions.md
|
65
ama-summarizer/main.py
Normal file
65
ama-summarizer/main.py
Normal file
@ -0,0 +1,65 @@
|
||||
import praw
|
||||
import os
|
||||
|
||||
|
||||
def get_reddit_instance():
|
||||
# Reddit API credentials
|
||||
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.2; rv:109.0) Gecko/20100101 Firefox/121.0"
|
||||
client_id = os.environ["REDDIT_CLIENT_ID"]
|
||||
client_secret = os.environ["REDDIT_CLIENT_SECRET"]
|
||||
reddit_pass = os.environ["REDDIT_PASSWORD"]
|
||||
username = os.environ["REDDIT_USERNAME"]
|
||||
|
||||
# Create a Reddit instance
|
||||
reddit = praw.Reddit(
|
||||
client_id=client_id,
|
||||
client_secret=client_secret,
|
||||
password=reddit_pass,
|
||||
user_agent=user_agent,
|
||||
username=username,
|
||||
)
|
||||
return reddit
|
||||
|
||||
|
||||
def get_post_url():
|
||||
post_url = input("Enter the AMA post URL: ") # reddit.com URLs preferred
|
||||
return post_url
|
||||
|
||||
|
||||
def get_guest_username():
|
||||
guest_username = input("Enter the AMA guest username: ")
|
||||
return guest_username
|
||||
|
||||
|
||||
def main():
|
||||
reddit = get_reddit_instance()
|
||||
|
||||
post_url = get_post_url()
|
||||
guest_username = get_guest_username()
|
||||
|
||||
submission = reddit.submission(url=post_url)
|
||||
submission.comments.replace_more(limit=None)
|
||||
|
||||
markdown_file = ""
|
||||
question_number = 1
|
||||
|
||||
for comment in submission.comments.list():
|
||||
if comment.author and comment.author.name.lower() == guest_username.lower():
|
||||
# TODO truncate long questions with ellipsis
|
||||
question_text = comment.parent().body.replace("\n", " ")
|
||||
# avoid deleted questions/comments
|
||||
if question_text != "[deleted]":
|
||||
question_link = "https://reddit.com" + comment.parent().permalink
|
||||
markdown_file += (
|
||||
f"{question_number}. [{question_text}]({question_link})\n\n"
|
||||
) # Add an extra newline after each question
|
||||
question_number += 1
|
||||
|
||||
with open("questions.md", "w", encoding="utf-8") as file:
|
||||
file.write(markdown_file)
|
||||
|
||||
print(f"{question_number - 1} questions generated successfully.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
5
ama-summarizer/readme.md
Normal file
5
ama-summarizer/readme.md
Normal file
@ -0,0 +1,5 @@
|
||||
# ama-summarizer
|
||||
|
||||
- The Python script to help during [AMAs](https://developersindia.in/ama-archive/). It generates a markdown file of questions and links to the questions the AMA guest has answered.
|
||||
- This script is designed to generate a Markdown file containing questions and links from a Reddit post's comments. It specifically focuses on questions or comments answered by a specific user.
|
||||
- The resulting Markdown file will contain a list of questions or comments that the specified guest has answered, with each question numbered and linked to the corresponding Reddit comment.
|
1
ama-summarizer/requirements.txt
Normal file
1
ama-summarizer/requirements.txt
Normal file
@ -0,0 +1 @@
|
||||
praw
|
20
aoc/main.py
20
aoc/main.py
@ -6,20 +6,21 @@ client_id = os.environ["REDDIT_CLIENT_ID"]
|
||||
client_secret = os.environ["REDDIT_CLIENT_SECRET"]
|
||||
reddit_pass = os.environ["REDDIT_PASSWORD"]
|
||||
username = os.environ["REDDIT_USERNAME"]
|
||||
user_agent = 'AdventOfCode Leaderboard Updater (by https://github.com/ni5arga/)'
|
||||
user_agent = 'AdventOfCode Leaderboard Updater - developersIndia'
|
||||
aoc_session_cookie = os.environ["AOC_SESSION_COOKIE"]
|
||||
aoc_leaderboard_code = os.environ["AOC_LEADERBOARD_CODE"]
|
||||
reddit_post_id = os.environ.get("REDDIT_POST_ID")
|
||||
aoc_year = os.environ.get("AOC_YEAR")
|
||||
reddit_post_id = os.environ.get("AOC_LEADERBOARD_REDDIT_POST_ID")
|
||||
|
||||
aoc_url = f'https://adventofcode.com/{{year}}/leaderboard/private/view/{aoc_leaderboard_code}.json'
|
||||
aoc_url = f'https://adventofcode.com/{aoc_year}/leaderboard/private/view/{aoc_leaderboard_code}.json'
|
||||
|
||||
def get_leaderboard_data():
|
||||
response = requests.get(aoc_url.format(year=2023), cookies={'session': aoc_session_cookie})
|
||||
response = requests.get(aoc_url.format(year=aoc_year), cookies={'session': aoc_session_cookie})
|
||||
data = response.json()
|
||||
return data
|
||||
|
||||
def format_leaderboard(data, num_players=100):
|
||||
leaderboard_stats = "r/developersIndia Advent of Code Leaderboard Stats\n\n"
|
||||
leaderboard_stats = f"r/developersIndia Advent of Code {aoc_year} - Leaderboard\n\n"
|
||||
leaderboard_stats += "| Rank | Player | Stars | Score |\n"
|
||||
leaderboard_stats += "|------|--------|-------|-------|\n"
|
||||
|
||||
@ -30,9 +31,12 @@ def format_leaderboard(data, num_players=100):
|
||||
for i, member_data in enumerate(sorted_members[:num_players]):
|
||||
# check for non-zero local_score
|
||||
if member_data['local_score'] > 0:
|
||||
# if member's name is null, use the member_id
|
||||
if member_data['name'] == None:
|
||||
member_data['name'] = f"Anonymous #{member_data['id']}"
|
||||
|
||||
leaderboard_stats += f"| {i + 1} | {member_data['name']} | {member_data['stars']} | {member_data['local_score']} |\n"
|
||||
|
||||
leaderboard_stats += f"\n[Advent of Code Leaderboard](https://adventofcode.com/2023/leaderboard/private/view/{aoc_leaderboard_code})\n"
|
||||
leaderboard_stats += f"\nUpdated every 24 hours"
|
||||
|
||||
return leaderboard_stats
|
||||
@ -43,7 +47,7 @@ def update_reddit_post(reddit, post_id, new_stats):
|
||||
|
||||
def main():
|
||||
if not reddit_post_id:
|
||||
print("Please set the REDDIT_POST_ID environment variable.")
|
||||
print("Please set the AOC_LEADERBOARD_REDDIT_POST_ID environment variable.")
|
||||
return
|
||||
|
||||
reddit = praw.Reddit(
|
||||
@ -55,9 +59,7 @@ def main():
|
||||
)
|
||||
|
||||
leaderboard_data = get_leaderboard_data()
|
||||
|
||||
formatted_stats = format_leaderboard(leaderboard_data)
|
||||
|
||||
update_reddit_post(reddit, reddit_post_id, formatted_stats)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@ -1,27 +1,28 @@
|
||||
# AoC Private Leaderboard Stats Updater Script for Reddit
|
||||
|
||||
## Required Environment Variables
|
||||
## Required Environment Variables
|
||||
|
||||
|
||||
1. `REDDIT_CLIENT_ID`: Reddit API client ID.
|
||||
2. `REDDIT_CLIENT_SECRET`: Reddit API client secret.
|
||||
3. `REDDIT_PASSWORD`: Reddit account password.
|
||||
4. `REDDIT_USERNAME`: Reddit account username.
|
||||
5. `AOC_SESSION_COOKIE`: Session cookie for the Advent of Code website.
|
||||
6. `AOC_LEADERBOARD_CODE`: Code for the Advent of Code leaderboard.
|
||||
7. `REDDIT_POST_ID`: ID of Reddit post which is used as leaderboard.
|
||||
1. `REDDIT_CLIENT_ID`: Reddit API client ID.
|
||||
2. `REDDIT_CLIENT_SECRET`: Reddit API client secret.
|
||||
3. `REDDIT_PASSWORD`: Reddit account password.
|
||||
4. `REDDIT_USERNAME`: Reddit account username.
|
||||
5. `AOC_SESSION_COOKIE`: Session cookie for the Advent of Code website.
|
||||
6. `AOC_LEADERBOARD_CODE`: Code for the Advent of Code leaderboard.
|
||||
7. `AOC_LEADERBOARD_REDDIT_POST_ID`: ID of Reddit post which is used as leaderboard.
|
||||
|
||||
----
|
||||
|
||||
## Instructions on how to get `AOC_SESSION_COOKIE`
|
||||
|
||||
1. **Create an Advent of Code Account:**
|
||||
- If you don't have an Advent of Code account, go to the [Advent of Code website](https://adventofcode.com/), and sign up for an account.
|
||||
|
||||
2. **Log into Your AoC Account & open the leaderboard**
|
||||
- After creating an account, log into the AoC website using your credentials. Make sure you have joined the private leaderboard which's ID you have set in `AOC_LEADERBOARD_CODE`. Now navigate to the leaderboard page.
|
||||
|
||||
|
||||
3. **Open Developer Tools in Your Browser:**
|
||||
- Open the browser's developer tools. You can usually do this by right-clicking on the web page, selecting "Inspect" or "Inspect Element," and then navigating to the "Network" tab.
|
||||
|
||||
|
||||
4. **Go to the Network Tab:**
|
||||
- In the developer tools, go to the "Network" tab. This tab will show all network requests made by the website.
|
||||
|
||||
@ -41,8 +42,4 @@
|
||||
9. **Use the Session Cookie:**
|
||||
- Paste the copied session cookie value into the appropriate environment variable (`AOC_SESSION_COOKIE` in this case) in your code or set it as an environment variable.
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||

|
||||
|
246
community-roundup/main.py
Normal file
246
community-roundup/main.py
Normal file
@ -0,0 +1,246 @@
|
||||
import datetime
|
||||
import praw
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import requests
|
||||
|
||||
client_id = os.environ["REDDIT_CLIENT_ID"]
|
||||
client_secret = os.environ["REDDIT_CLIENT_SECRET"]
|
||||
reddit_pass = os.environ["REDDIT_PASSWORD"]
|
||||
username = os.environ["REDDIT_USERNAME"]
|
||||
user_agent = "Community Roundup Post"
|
||||
token = os.environ["GIST_TOKEN"]
|
||||
gist_id = os.environ["GIST_ID"]
|
||||
sub = "developersIndia"
|
||||
|
||||
|
||||
def is_last_day_of_month():
|
||||
today = datetime.date.today()
|
||||
tomorrow = today + datetime.timedelta(days=1)
|
||||
return tomorrow.day == 1
|
||||
|
||||
|
||||
def get_posts_by_flair(subreddit, flair):
|
||||
current_year = datetime.date.today().year
|
||||
current_month = datetime.date.today().month
|
||||
posts = []
|
||||
for post in subreddit.search(f'flair_name:"{flair}"', time_filter="month"):
|
||||
post_date = datetime.datetime.fromtimestamp(post.created_utc)
|
||||
if post_date.year == current_year and post_date.month == current_month and post.selftext != '[deleted]':
|
||||
post.title = post.title.replace("|", "\\|") # Escape the "|" character
|
||||
posts.append(post)
|
||||
|
||||
posts = sorted(posts, key=lambda post: post.created_utc, reverse=True)
|
||||
return posts
|
||||
|
||||
|
||||
def get_weekly_discussion_posts(subreddit):
|
||||
flair = next(
|
||||
filter(
|
||||
lambda flair: "Weekly Discussion" in flair["flair_text"],
|
||||
subreddit.flair.link_templates.user_selectable(),
|
||||
)
|
||||
)
|
||||
|
||||
return get_posts_by_flair(subreddit, flair["flair_text"])
|
||||
|
||||
|
||||
def get_ama_posts(subreddit):
|
||||
flair = next(
|
||||
filter(
|
||||
lambda flair: "AMA" in flair["flair_text"],
|
||||
subreddit.flair.link_templates.user_selectable(),
|
||||
)
|
||||
)
|
||||
|
||||
return get_posts_by_flair(subreddit, flair["flair_text"])
|
||||
|
||||
|
||||
def get_i_made_this_posts(subreddit):
|
||||
flair = next(
|
||||
filter(
|
||||
lambda flair: "I Made This" in flair["flair_text"],
|
||||
subreddit.flair.link_templates.user_selectable(),
|
||||
)
|
||||
)
|
||||
|
||||
# Get all posts with the specified flair
|
||||
posts = get_posts_by_flair(subreddit, flair["flair_text"])
|
||||
|
||||
# Sort the posts by upvotes and then comments in descending order
|
||||
posts = sorted(
|
||||
posts, key=lambda post: (post.score, post.num_comments), reverse=True
|
||||
)
|
||||
|
||||
# Return only the top 10 posts
|
||||
return posts[:20]
|
||||
|
||||
|
||||
def get_announcement_posts(subreddit):
|
||||
flair = next(
|
||||
filter(
|
||||
lambda flair: "Announcement" in flair["flair_text"],
|
||||
subreddit.flair.link_templates.user_selectable(),
|
||||
)
|
||||
)
|
||||
|
||||
return get_posts_by_flair(subreddit, flair["flair_text"])
|
||||
|
||||
|
||||
def code_collaboration_posts(subreddit):
|
||||
flair = next(
|
||||
filter(
|
||||
lambda flair: "Code Collab" in flair["flair_text"],
|
||||
subreddit.flair.link_templates.user_selectable(),
|
||||
)
|
||||
)
|
||||
|
||||
return get_posts_by_flair(subreddit, flair["flair_text"])
|
||||
|
||||
def get_gist_content(gist_id):
|
||||
headers = {
|
||||
"Authorization": f"token {token}",
|
||||
"Accept": "application/vnd.github.v3+json",
|
||||
}
|
||||
response = requests.get(f"https://api.github.com/gists/{gist_id}", headers=headers)
|
||||
gist = response.json()
|
||||
filename = list(gist["files"].keys())[0]
|
||||
return gist["files"][filename]["content"]
|
||||
|
||||
|
||||
def get_community_threads():
|
||||
saved_collection_posts = json.loads(get_gist_content(gist_id))
|
||||
# filter posts for this month & year
|
||||
saved_collection_posts = list(
|
||||
filter(
|
||||
lambda post: datetime.datetime.strptime(
|
||||
post["created_at"], "%Y-%m-%dT%H:%M:%S"
|
||||
).year
|
||||
== datetime.date.today().year
|
||||
and datetime.datetime.strptime(
|
||||
post["created_at"], "%Y-%m-%dT%H:%M:%S"
|
||||
).month
|
||||
== datetime.date.today().month,
|
||||
saved_collection_posts["posts"],
|
||||
)
|
||||
)
|
||||
return saved_collection_posts
|
||||
|
||||
|
||||
def create_community_roundup_post(
|
||||
subreddit,
|
||||
posts,
|
||||
i_made_this_posts,
|
||||
weekly_discussion_posts,
|
||||
ama_posts,
|
||||
announcement_posts,
|
||||
collab_posts,
|
||||
):
|
||||
flair = next(
|
||||
filter(
|
||||
lambda flair: "Community Roundup" in flair["flair_text"],
|
||||
subreddit.flair.link_templates.user_selectable(),
|
||||
)
|
||||
)
|
||||
|
||||
title = "Community Roundup: List of interesting discussions that happened in {month} {year}".format(
|
||||
month=datetime.date.today().strftime("%B"), year=datetime.date.today().year
|
||||
)
|
||||
|
||||
footer_text = """\n\n
|
||||
---
|
||||
|
||||
**Community Roundup is posted on the last day of each month. To explore a compilation of all interesting posts and community threads over time, [visit our wiki](https://www.reddit.com/r/developersIndia/wiki/community-threads/).**\n
|
||||
The collection is curated by our volunteer team & is independent of the number of upvotes and comments (except for "I made This" posts). If you believe we may have overlooked any engaging posts or discussions, please share them with us via [modmail](https://reddit.com/message/compose?to=r/developersIndia&subject=Community%20Threads%20Collection%20Suggestion&message=Hey%20folks%2C%0A%0A%3Cpost%20link%3E).\n
|
||||
"""
|
||||
text = ""
|
||||
|
||||
if len(announcement_posts) > 0:
|
||||
text = "## Announcements\n|Announcements from volunteer team|\n|--------|\n"
|
||||
for post in announcement_posts:
|
||||
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||
else:
|
||||
print("No announcements found. Skipping")
|
||||
|
||||
if len(ama_posts) > 0:
|
||||
text += "\n## AMAs\n|Read insights from guests that joined us for a day |\n|--------|\n"
|
||||
for post in ama_posts:
|
||||
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||
else:
|
||||
print("No AMAs found. Skipping")
|
||||
|
||||
if len(posts) > 0:
|
||||
text += "\n## Community Threads\n|S.No|Insightful discussions started by community members|\n|--------|--------|\n"
|
||||
posts_counter = 0
|
||||
for post in posts:
|
||||
posts_counter += 1
|
||||
text += f"| {posts_counter} | [**{post['title']}**]({post['url']}) |\n"
|
||||
else:
|
||||
print("No posts found in the collection for this month. Skipping")
|
||||
|
||||
if len(weekly_discussion_posts) > 0:
|
||||
text += "\n## Weekly Discussions\n|Weekly tech discussions started by Volunteer Team|\n|--------|\n"
|
||||
for post in weekly_discussion_posts:
|
||||
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||
else:
|
||||
print("No weekly discussions found. Skipping")
|
||||
|
||||
if len(collab_posts) > 0:
|
||||
text += "\n## Code Collab\n|Folks looking for collaborations on hackathons, projects etc.|\n|--------|\n"
|
||||
for post in collab_posts:
|
||||
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||
else:
|
||||
print("No Code Collaboration posts found. Skipping")
|
||||
|
||||
if len(i_made_this_posts) > 0:
|
||||
text += "\n## I Made This\n\nFind more projects & builders on our [Showcase Sunday Megathreads](https://www.reddit.com/r/developersIndia/?f=flair_name%3A%22Showcase%20Sunday%20%3Asnoo_hearteyes%3A%22)\n\n"
|
||||
text += "|Top 20 projects built by community members|\n|--------|\n"
|
||||
for post in i_made_this_posts:
|
||||
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||
else:
|
||||
print("No I Made This posts found. Skipping")
|
||||
|
||||
text = text + footer_text
|
||||
|
||||
submission = subreddit.submit(
|
||||
title,
|
||||
selftext=text,
|
||||
flair_id=flair["flair_template_id"],
|
||||
)
|
||||
submission.mod.approve()
|
||||
submission.mod.sticky()
|
||||
submission.mod.distinguish()
|
||||
submission.mod.lock()
|
||||
|
||||
return submission
|
||||
|
||||
|
||||
def main():
|
||||
reddit = praw.Reddit(
|
||||
client_id=client_id,
|
||||
client_secret=client_secret,
|
||||
username=username,
|
||||
password=reddit_pass,
|
||||
user_agent=user_agent,
|
||||
)
|
||||
|
||||
subreddit = reddit.subreddit(sub)
|
||||
|
||||
if is_last_day_of_month():
|
||||
posts = get_community_threads()
|
||||
i_made_this_posts = get_i_made_this_posts(subreddit)
|
||||
weekly_discussion_posts = get_weekly_discussion_posts(subreddit)
|
||||
ama_posts = get_ama_posts(subreddit)
|
||||
announcement_posts = get_announcement_posts(subreddit)
|
||||
collab_posts = code_collaboration_posts(subreddit)
|
||||
create_community_roundup_post(
|
||||
subreddit, posts, i_made_this_posts, weekly_discussion_posts, ama_posts, announcement_posts, collab_posts
|
||||
)
|
||||
print("Community Roundup post created successfully!")
|
||||
else:
|
||||
print("Skipping. Not the last day of the month")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
2
community-roundup/requirements.txt
Normal file
2
community-roundup/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
praw
|
||||
requests
|
@ -1,5 +1,6 @@
|
||||
import praw
|
||||
import os
|
||||
import argparse
|
||||
from datetime import datetime
|
||||
import json
|
||||
from collections import defaultdict
|
||||
@ -36,13 +37,45 @@ def update_gist(gist_id, filename, content, description=""):
|
||||
)
|
||||
return response.json()
|
||||
|
||||
# farewell, reddit collections
|
||||
# def get_collection(reddit):
|
||||
# collection = reddit.subreddit(sub).collections(
|
||||
# permalink="https://reddit.com/r/developersIndia/collection/958aef35-f9cb-414d-ab33-08bc639e47de"
|
||||
# )
|
||||
# return collection
|
||||
|
||||
def get_collection(reddit):
|
||||
collection = reddit.subreddit(sub).collections(
|
||||
permalink="https://reddit.com/r/developersIndia/collection/958aef35-f9cb-414d-ab33-08bc639e47de"
|
||||
# let the author know their post is now part of the collection!
|
||||
def send_message(reddit, username, post_link):
|
||||
message_subject = 'Woohoo! Your post is now part of our community threads collection!'
|
||||
message_text = """
|
||||
Hi there,\n
|
||||
It looks like one of your [posts]({post_link}) on r/developersIndia was picked-up by the volunteer team to be part of our curated list of 200+ amazing discussions in the community.\n
|
||||
|
||||
- You can find your post in our [Community Threads Collection](https://reddit.com/r/developersIndia/wiki/community-threads). Feel free to share the collection with your dev friends.\n
|
||||
- We post a compilation of these threads every month-end in [Community Roundups](https://www.reddit.com/r/developersIndia/?f=flair_name%3A%22Community%20Roundup%22). Stay tuned for the next one!\n
|
||||
|
||||
|
||||
Cheers,\n
|
||||
The r/developersIndia Community Team
|
||||
"""
|
||||
reddit.redditor(username).message(
|
||||
subject=message_subject, message=message_text.format(post_link=post_link), from_subreddit=reddit.subreddit(sub)
|
||||
)
|
||||
return collection
|
||||
|
||||
def get_post_data(reddit, post_url):
|
||||
submission = reddit.submission(url=post_url)
|
||||
post = {
|
||||
"title": submission.title,
|
||||
"url": submission.permalink,
|
||||
"id": submission.id,
|
||||
"num_comments": submission.num_comments,
|
||||
"created_at": datetime.utcfromtimestamp(
|
||||
submission.created_utc
|
||||
).isoformat(),
|
||||
"flair_text": submission.link_flair_text,
|
||||
"author": submission.author.name if submission.author else "",
|
||||
}
|
||||
return post
|
||||
|
||||
def update_wiki(reddit, wikipage, posts):
|
||||
# Group posts by year
|
||||
@ -61,7 +94,7 @@ def update_wiki(reddit, wikipage, posts):
|
||||
|
||||
wiki_header = """# A collection of must read discussions started by community members"""
|
||||
content = wiki_header + "\n\n"
|
||||
content += f"A handpicked collection of **{total_posts}** interesting posts, discussions & high-quality threads gathered over **{total_years}** years & counting.\n\n"
|
||||
content += f"A handpicked collection of **{total_posts}** interesting posts, discussions & high-quality threads gathered over **{total_years-1}** years & counting.\n\n"
|
||||
content += "If you spot a post that could be in this list, send us a [modmail](https://reddit.com/message/compose?to=r/developersIndia&subject=Community%20Threads%20Collection%20Suggestion&message=Hey%20folks%2C%0A%0A%3Cpost%20link%3E)\n\n"
|
||||
|
||||
for year in sorted(posts_by_year.keys(), reverse=True):
|
||||
@ -78,6 +111,10 @@ def update_wiki(reddit, wikipage, posts):
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Update Community Threads Collection.')
|
||||
parser.add_argument('post_url', help='The URL of the Reddit post to add.')
|
||||
args = parser.parse_args()
|
||||
|
||||
reddit = praw.Reddit(
|
||||
client_id=client_id,
|
||||
client_secret=client_secret,
|
||||
@ -86,78 +123,45 @@ def main():
|
||||
user_agent=f"Automod reader by u/{username}",
|
||||
)
|
||||
|
||||
collection = get_collection(reddit)
|
||||
|
||||
saved_collection_posts = json.loads(get_gist_content(gist_id))
|
||||
saved_collection_ids = [post["id"] for post in saved_collection_posts["posts"]]
|
||||
|
||||
print(f"Database was last updated on {saved_collection_posts['collection_last_updated']}")
|
||||
print(f"Collection was last updated on {datetime.utcfromtimestamp(collection.last_update_utc).isoformat()}")
|
||||
|
||||
if (
|
||||
saved_collection_posts["collection_last_updated"]
|
||||
!= datetime.utcfromtimestamp(collection.last_update_utc).isoformat()
|
||||
):
|
||||
print("Collection was updated, getting new posts data...")
|
||||
posts = []
|
||||
for submission_id in saved_collection_posts["posts"]:
|
||||
post = {
|
||||
"title": submission_id["title"],
|
||||
"url": submission_id["url"],
|
||||
"id": submission_id["id"],
|
||||
"num_comments": submission_id["num_comments"],
|
||||
"created_at": submission_id["created_at"],
|
||||
"flair_text": submission_id["flair_text"],
|
||||
}
|
||||
posts.append(post)
|
||||
|
||||
# given 2 lists find non-common elements
|
||||
db_posts = set(saved_collection_ids)
|
||||
collection_posts = []
|
||||
for submission in collection:
|
||||
collection_posts.append(submission.id)
|
||||
collection_posts = set(collection_posts)
|
||||
|
||||
new_posts = list(collection_posts - db_posts)
|
||||
deleted_posts = list(db_posts - collection_posts)
|
||||
|
||||
print(f"Found {len(new_posts)} new posts!")
|
||||
print(f"Found {len(deleted_posts)} deleted posts!")
|
||||
|
||||
posts = []
|
||||
# load the saved collection posts data
|
||||
for submission_id in saved_collection_posts["posts"]:
|
||||
if submission_id["id"] in deleted_posts:
|
||||
continue
|
||||
post = {
|
||||
"title": submission_id["title"],
|
||||
"url": submission_id["url"],
|
||||
"id": submission_id["id"],
|
||||
"num_comments": submission_id["num_comments"],
|
||||
"created_at": submission_id["created_at"],
|
||||
"flair_text": submission_id["flair_text"],
|
||||
}
|
||||
posts.append(post)
|
||||
|
||||
# get the new posts data
|
||||
for submission_id in new_posts:
|
||||
submission = reddit.submission(submission_id)
|
||||
post = {
|
||||
"title": submission.title,
|
||||
"url": submission.url,
|
||||
"id": submission.id,
|
||||
"num_comments": submission.num_comments,
|
||||
"created_at": datetime.utcfromtimestamp(
|
||||
submission.created_utc
|
||||
).isoformat(),
|
||||
"flair_text": submission.link_flair_text,
|
||||
}
|
||||
posts.append(post)
|
||||
|
||||
# sort the posts by created_at
|
||||
new_post = get_post_data(reddit, args.post_url)
|
||||
if new_post["id"] not in saved_collection_ids:
|
||||
new_post["title"] = new_post["title"].strip()
|
||||
posts.append(new_post)
|
||||
posts = sorted(posts, key=lambda k: k["created_at"])
|
||||
|
||||
collection_json = {
|
||||
"collection_last_updated": datetime.utcfromtimestamp(
|
||||
collection.last_update_utc
|
||||
).isoformat(),
|
||||
"collection_last_updated": datetime.utcnow().isoformat(),
|
||||
"posts": posts,
|
||||
}
|
||||
|
||||
update_gist(gist_id, "collection.json", json.dumps(collection_json, indent=4))
|
||||
print("Internal database updated successfully!")
|
||||
update_wiki(reddit, "community-threads", posts)
|
||||
if new_post["author"]:
|
||||
send_message(reddit, new_post["author"], new_post["url"])
|
||||
print("Message sent to the author!")
|
||||
else:
|
||||
print("Author username is empty. No message sent.")
|
||||
|
||||
else:
|
||||
print("Wiki is up to date!")
|
||||
print("Post is already in the collection. No changes were made.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
17
event-manager/.env.sample
Normal file
17
event-manager/.env.sample
Normal file
@ -0,0 +1,17 @@
|
||||
# DISCORD BOT TOKEN
|
||||
# MUST HAVE PERMISSIONS TO CREATE EVENTS & MANAGE EVENTS
|
||||
# https://discord.com/developers/applications
|
||||
|
||||
export DISCORD_BOT_TOKEN = "TOKEN"
|
||||
|
||||
# -----------
|
||||
|
||||
# DISCORD SERVER ID (GUILD ID)
|
||||
# developersIndia => 1229786646468362260
|
||||
export DISCORD_GUILD_ID = 1229786646468362260
|
||||
|
||||
# -----------
|
||||
|
||||
# CALANDER ID
|
||||
# developersIndia => "9f1337e4154910eb1bdb3bfac32b88f69546468b1281a6db58f50a909df5049f@group.calendar.google.com"
|
||||
export GOOGLE_CALENDAR_ID = "9f1337e4154910eb1bdb3bfac32b88f69546468b1281a6db58f50a909df5049f@group.calendar.google.com"
|
52
event-manager/README.md
Normal file
52
event-manager/README.md
Normal file
@ -0,0 +1,52 @@
|
||||
# Automation to create events across Google Calendar & Discord
|
||||
|
||||
|
||||
## Description
|
||||
|
||||
This script creates events across [Google Calendar](https://developersindia.in/events-calendar/) & [Discord](https://discord.com/channels/669880381649977354/)
|
||||
|
||||
### First Time Setup
|
||||
|
||||
1. Get Python3
|
||||
|
||||
```bash
|
||||
sudo apt-get install python3 && python3 --version
|
||||
```
|
||||
|
||||
2. Install required packages
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
3. Add respective tokens in the `.env` file
|
||||
|
||||
```bash
|
||||
cp .sample.env .env
|
||||
```
|
||||
|
||||
1. `DISCORD_BOT_TOKEN`
|
||||
- Get it from [Discord Developers portal](https://discord.com/developers/applications/)) (bot must have MANAGE_EVENT & CREATE_EVENT permission)
|
||||
|
||||
2. `DISCORD_GUILD_ID`
|
||||
- developersIndia's GUID is `1229786646468362260`
|
||||
|
||||
3. `GOOGLE_CALENDAR_ID`
|
||||
- developersIndia calendar is public, `9f1337e4154910eb1bdb3bfac32b88f69546468b1281a6db58f50a909df5049f@group.calendar.google.com`
|
||||
|
||||
4. Connect Google calendar through [Google cloud Console](https://console.cloud.google.com/)
|
||||
1. 4.1 Create a Project on Google Cloud Console
|
||||
2. Search for calendar API and enable it
|
||||
3. Create Credentials -> OAuth Client ID -> Application type as Desktop
|
||||
4. Download the JSON file
|
||||
5. Rename that JSON file as `credentials.json` and save it to the project directory.
|
||||
|
||||
5. `python3 main.py`
|
||||
|
||||
---
|
||||
|
||||
### NOTES-
|
||||
|
||||
> - Google authenication is required for the first time.
|
||||
>
|
||||
> - A file `token.json` will be downloaded automatically, and no web login will be needed afterwards.
|
57
event-manager/discord_bot.py
Normal file
57
event-manager/discord_bot.py
Normal file
@ -0,0 +1,57 @@
|
||||
from datetime import datetime, timedelta
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
|
||||
|
||||
def create_discord_event(
|
||||
bot_token,
|
||||
guild_id,
|
||||
EVENT_NAME,
|
||||
EVENT_DESCRIPTION,
|
||||
EVENT_LOCATION,
|
||||
EVENT_DATE,
|
||||
EVENT_START_TIME,
|
||||
EVENT_END_TIME,
|
||||
):
|
||||
|
||||
bot = commands.Bot(command_prefix="!", intents=discord.Intents.default())
|
||||
|
||||
@bot.event
|
||||
async def on_ready():
|
||||
|
||||
# Convert the date string to a datetime object
|
||||
date_object = datetime.strptime(EVENT_DATE, "%Y-%m-%d")
|
||||
|
||||
# Convert the time string to a datetime object
|
||||
start_time_object = datetime.strptime(EVENT_START_TIME, "%H:%M")
|
||||
end_time_object = datetime.strptime(EVENT_END_TIME, "%H:%M")
|
||||
|
||||
# Combine the date and time objects
|
||||
st = date_object.replace(
|
||||
hour=start_time_object.hour, minute=start_time_object.minute
|
||||
).astimezone()
|
||||
et = date_object.replace(
|
||||
hour=end_time_object.hour, minute=end_time_object.minute
|
||||
).astimezone()
|
||||
|
||||
gg = bot.get_guild(guild_id)
|
||||
|
||||
try:
|
||||
event = await gg.create_scheduled_event(
|
||||
name=EVENT_NAME,
|
||||
entity_type=discord.EntityType.external,
|
||||
description=EVENT_DESCRIPTION,
|
||||
start_time=st,
|
||||
end_time=et,
|
||||
location=EVENT_LOCATION,
|
||||
privacy_level=discord.PrivacyLevel.guild_only,
|
||||
)
|
||||
print("Discord Event created: ", event.url)
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
await bot.close()
|
||||
|
||||
# Run the bot
|
||||
bot.run(bot_token)
|
58
event-manager/google_calendar.py
Normal file
58
event-manager/google_calendar.py
Normal file
@ -0,0 +1,58 @@
|
||||
import os.path
|
||||
|
||||
from google.auth.transport.requests import Request
|
||||
from google.oauth2.credentials import Credentials
|
||||
from google_auth_oauthlib.flow import InstalledAppFlow
|
||||
from googleapiclient.discovery import build
|
||||
|
||||
SCOPES = ["https://www.googleapis.com/auth/calendar"]
|
||||
|
||||
|
||||
def create_google_calendar_event(
|
||||
calendar_id, name, description, location, date, start_time, end_time
|
||||
):
|
||||
|
||||
creds = None
|
||||
|
||||
# The file token.json stores the user's access and refresh tokens
|
||||
if os.path.exists("token.json"):
|
||||
creds = Credentials.from_authorized_user_file("token.json", SCOPES)
|
||||
|
||||
# If there are no (valid) credentials available, let the user log in.
|
||||
if not creds or not creds.valid:
|
||||
if creds and creds.expired and creds.refresh_token:
|
||||
creds.refresh(Request())
|
||||
else:
|
||||
print("Login to your Google account. [THIS IS A ONE TIME PROCESS]")
|
||||
flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
|
||||
creds = flow.run_local_server(port=0)
|
||||
# Save the credentials for the next run
|
||||
with open("token.json", "w") as token:
|
||||
token.write(creds.to_json())
|
||||
|
||||
try:
|
||||
service = build("calendar", "v3", credentials=creds)
|
||||
start = f"{date}T{start_time}:00"
|
||||
end = f"{date}T{end_time}:00"
|
||||
event = {
|
||||
"summary": name,
|
||||
"location": location,
|
||||
"description": description,
|
||||
"start": {
|
||||
"dateTime": start,
|
||||
"timeZone": "Asia/Kolkata",
|
||||
},
|
||||
"end": {
|
||||
"dateTime": end,
|
||||
"timeZone": "Asia/Kolkata",
|
||||
},
|
||||
}
|
||||
|
||||
event = service.events().insert(calendarId=calendar_id, body=event).execute()
|
||||
|
||||
print("Calendar event created: %s" % (event.get("htmlLink")))
|
||||
return event
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return None
|
29
event-manager/main.py
Normal file
29
event-manager/main.py
Normal file
@ -0,0 +1,29 @@
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
bot_token = os.getenv('DISCORD_BOT_TOKEN')
|
||||
guild_id = int(os.getenv('DISCORD_GUILD_ID'))
|
||||
calendar_id = os.getenv('GOOGLE_CALENDAR_ID')
|
||||
|
||||
def get_input():
|
||||
NAME = input("Event title: ")
|
||||
DESCRIPTION = input("Event description: ")
|
||||
LOCATION = input("Event location (red -> for developersindia subreddit): ")
|
||||
if LOCATION == "red":
|
||||
LOCATION = "https://www.reddit.com/r/developersindia/"
|
||||
DATE = input("Enter the event date (yyyy-mm-dd): ")
|
||||
START_TIME = input("Enter the event start time (hh:mm)- ")
|
||||
END_TIME = input("Enter the event end time (hh:mm)- ")
|
||||
|
||||
return NAME, DESCRIPTION, LOCATION, DATE, START_TIME, END_TIME
|
||||
|
||||
EVENT_NAME, EVENT_DESCRIPTION, EVENT_LOCATION, EVENT_DATE, EVENT_START_TIME, EVENT_END_TIME = get_input()
|
||||
|
||||
# Execute create_discord_event
|
||||
from discord_bot import create_discord_event
|
||||
create_discord_event(bot_token, guild_id, EVENT_NAME, EVENT_DESCRIPTION, EVENT_LOCATION, EVENT_DATE, EVENT_START_TIME, EVENT_END_TIME)
|
||||
|
||||
# Execute google_calendar_event
|
||||
from google_calendar import create_google_calendar_event
|
||||
create_google_calendar_event(calendar_id, EVENT_NAME, EVENT_DESCRIPTION, EVENT_LOCATION, EVENT_DATE, EVENT_START_TIME, EVENT_END_TIME)
|
5
event-manager/requirements.txt
Normal file
5
event-manager/requirements.txt
Normal file
@ -0,0 +1,5 @@
|
||||
discord.py
|
||||
google-api-python-client
|
||||
google-auth-httplib2
|
||||
google-auth-oauthlib
|
||||
python-dotenv
|
@ -2,28 +2,22 @@
|
||||
"titles": [
|
||||
"wrestling with Jira",
|
||||
"trapped in endless meetings",
|
||||
"exterminating code critters",
|
||||
"centering divs for fun",
|
||||
"impatiently waiting on staging",
|
||||
"crafting elegant tests",
|
||||
"yolo pushing to prod",
|
||||
"code review detectives",
|
||||
"assassinating Jira tickets",
|
||||
"forging majestic pull requests",
|
||||
"DB migration amnesiacs",
|
||||
"lgtm",
|
||||
"LGTM",
|
||||
"staging environment warriors",
|
||||
"taming wild git branches",
|
||||
"unleashing the MVP",
|
||||
"Jira ticket treasure hunters",
|
||||
"jira ticket treasure hunters",
|
||||
"merge conflict negotiators",
|
||||
"absorbing knowledge transfer",
|
||||
"absorbing KTs",
|
||||
"purging container hoarders",
|
||||
"bug creators and breadwinners",
|
||||
"DSA explorers",
|
||||
"escaping Vim's clutches",
|
||||
"indexing database maestros",
|
||||
"YAML whisperers",
|
||||
"debugging code in dreams",
|
||||
"refactoring like it's an art",
|
||||
"living on Stack Overflow",
|
||||
@ -42,6 +36,13 @@
|
||||
"refining their Google-fu",
|
||||
"upgrading their tech stacks",
|
||||
"writing self-documenting code",
|
||||
"drowning in technical debt"
|
||||
"drowning in technical debt",
|
||||
"stuck on git merge",
|
||||
"asking for PR reviews",
|
||||
"finding DB backups",
|
||||
"venting about YAML",
|
||||
"not writing unit tests",
|
||||
"writing unit tests",
|
||||
"think TDD is a joke"
|
||||
]
|
||||
}
|
||||
|
@ -23,13 +23,13 @@ class Config:
|
||||
SUBREDDIT = "developersindia"
|
||||
|
||||
POST_FLAIR = "Hiring"
|
||||
POST_TITLE = f"Don't Miss Out on These Job Opportunities | Weekly Job Openings Thread | {strftime(STRFTIME_FORMAT)}"
|
||||
POST_TITLE = f"Don't Miss Out on These Job Opportunities | Job Openings Mega-thread | {strftime(STRFTIME_FORMAT)}"
|
||||
POST_TEXT = """\
|
||||
This thread has all the latest job openings that haven't been posted on previous weekly threads.
|
||||
This thread has all the latest job openings that haven't been posted on previous hiring mega threads.
|
||||
|
||||
If you have a job opening that you'd like to share with the community, you can post it using this link:- https://developersindia.in/post-a-job/
|
||||
|
||||
For all the available job openings, check out the Job Board at:- https://developersindia.in/job-board/
|
||||
- If you have a job opening that you'd like to share with the community, you can post it using [this link](https://developersindia.in/post-a-job/).
|
||||
- For all the available job openings, check out our [Job Board](https://developersindia.in/job-board/).
|
||||
- If you are looking for work, consider participating in our monthly ["Hire Me" megathreads](https://www.reddit.com/r/developersIndia/?f=flair_name%3A%22Hire%20Me%22).
|
||||
|
||||
Stay tuned for updates on the latest job openings, and apply for the ones that interest you. Wishing you the best of luck in your job search!\
|
||||
"""
|
||||
@ -180,6 +180,9 @@ def create_job_post(subreddit) -> Post:
|
||||
flair_id=flair["flair_template_id"],
|
||||
)
|
||||
submission.mod.sticky()
|
||||
submission.mod.distinguish()
|
||||
submission.mod.approve()
|
||||
submission.mod.lock()
|
||||
|
||||
return Post(post_id=submission.id, epoch=submission.created_utc)
|
||||
|
2
job-thread/requirements.txt
Normal file
2
job-thread/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
praw
|
||||
feedparser
|
@ -28,11 +28,13 @@ def create_showcase_sunday_megathread(subreddit):
|
||||
|
||||
title = "Showcase Sunday Megathread - {month} {year}".format(month=datetime.date.today().strftime("%B"), year=datetime.date.today().year)
|
||||
text = """
|
||||
It's time for our monthly showcase thread where we celebrate the incredible talent in our community. Whether it's an app, a website, a tool, or anything else you've built, we want to see it! Share your latest creations, side projects, or even your work-in-progress.
|
||||
It's time for our monthly showcase thread where we celebrate the incredible talent in our community. Whether it's an app, a website, a tool, or anything else you've built, we want to see it! Share your latest creations, side projects, or even your work-in-progress. Ask for feedback, and help each other out.
|
||||
|
||||
Let's inspire each other and celebrate the diverse skills we have. Comment below with details about what you've built, the tech stack used, and any interesting challenges faced along the way.
|
||||
|
||||
**Showcase Sunday thread is posted on the second Sunday of every month. You can find the [schedule on our calendar](https://developersindia.in/events-calendar).**
|
||||
### [Looking for more projects built by developersIndia community members?](https://www.reddit.com/r/developersIndia/?f=flair_name%3A%22I%20Made%20This%20%3Asnoo_wink%3A%22)
|
||||
|
||||
**Showcase Sunday thread is posted on the second Sunday of every month. You can find the [schedule on our calendar](https://developersindia.in/events-calendar). You can also find past [showcase sunday megathreads here](https://www.reddit.com/r/developersIndia/?f=flair_name%3A%22Showcase%20Sunday%20%3Asnoo_hearteyes%3A%22)**.
|
||||
"""
|
||||
|
||||
submission = subreddit.submit(
|
||||
|
@ -75,7 +75,7 @@ old_flairs_total_count = sum(old_available_flair_count.values())
|
||||
# print(f"Total count of user-flairs: {total_count + emoji_flair_count + old_flairs_total_count}")
|
||||
|
||||
data = {
|
||||
'Users with un-supported (old) text flairs': f"**{old_flairs_total_count}**",
|
||||
'Users with custom text flairs': f"**{old_flairs_total_count}**",
|
||||
'Users with supported text flairs': f"**{total_count}**",
|
||||
'Users with emoji only flairs': f"**{emoji_flair_count}**",
|
||||
'Total count of user-flairs': f"**{total_count + emoji_flair_count + old_flairs_total_count}**"
|
||||
|
108
verifier/main.py
108
verifier/main.py
@ -1,7 +1,8 @@
|
||||
import os
|
||||
import sys
|
||||
import praw
|
||||
|
||||
import time
|
||||
import datetime
|
||||
|
||||
client_id = os.environ["REDDIT_CLIENT_ID"]
|
||||
client_secret = os.environ["REDDIT_CLIENT_SECRET"]
|
||||
@ -10,12 +11,61 @@ username = os.environ["REDDIT_USERNAME"]
|
||||
sub = "developersIndia"
|
||||
|
||||
|
||||
def get_last_activity_times(reddit, username):
|
||||
user = reddit.redditor(username)
|
||||
|
||||
# Get the user's last comment time in the subreddit
|
||||
last_comment_time = None
|
||||
for comment in user.comments.new(
|
||||
limit=100
|
||||
): # look at the user's 100 most recent comments
|
||||
if comment.subreddit.display_name == sub:
|
||||
last_comment_time = datetime.datetime.fromtimestamp(comment.created_utc).strftime('%d %B, %Y')
|
||||
break
|
||||
|
||||
# Get the user's last post creation time and title in the subreddit
|
||||
last_post_time = None
|
||||
last_post_title = None
|
||||
for submission in user.submissions.new(
|
||||
limit=100
|
||||
): # look at the user's 100 most recent posts
|
||||
if submission.subreddit.display_name == sub:
|
||||
last_post_time = datetime.datetime.fromtimestamp(submission.created_utc).strftime('%d %B, %Y')
|
||||
last_post_title = submission.title
|
||||
break
|
||||
|
||||
return last_comment_time, last_post_time, last_post_title
|
||||
|
||||
def get_current_flair(reddit, username):
|
||||
subreddit = reddit.subreddit(sub)
|
||||
flair = next(subreddit.flair(username))
|
||||
template = get_flair_template_from_text(reddit, flair["flair_text"])
|
||||
|
||||
if template is None:
|
||||
return None, None
|
||||
|
||||
return flair["flair_text"], template["id"]
|
||||
|
||||
def get_flair(reddit, username):
|
||||
subreddit = reddit.subreddit(sub)
|
||||
flair = next(subreddit.flair(username))
|
||||
|
||||
template = get_template_from_flair_text(reddit, flair["flair_text"])
|
||||
|
||||
if template is None:
|
||||
return None, None
|
||||
|
||||
return flair["flair_text"], template["id"]
|
||||
|
||||
def assign_user_flair(reddit, username, flair_text):
|
||||
subreddit = reddit.subreddit(sub)
|
||||
flair = next(subreddit.flair(username))
|
||||
|
||||
template = get_flair_template_from_text(reddit, flair['flair_text'])
|
||||
subreddit.flair.set(username, text=flair_text, flair_template_id=template['id'])
|
||||
template = get_flair_template_from_text(reddit, flair["flair_text"])
|
||||
# append YoE to the flair text
|
||||
verified_text = f"{flair['flair_text']} | {flair_text}"
|
||||
subreddit.flair.set(username, text=verified_text, flair_template_id=template["id"])
|
||||
|
||||
|
||||
def get_flair_templates(reddit):
|
||||
subreddit = reddit.subreddit(sub)
|
||||
@ -25,7 +75,15 @@ def get_flair_templates(reddit):
|
||||
def get_flair_template_from_text(reddit, flair_text):
|
||||
templates = get_flair_templates(reddit)
|
||||
for template in templates:
|
||||
if template['text'] == flair_text:
|
||||
if template["text"] == flair_text:
|
||||
return template
|
||||
|
||||
|
||||
def get_template_from_flair_text(reddit, flair_text):
|
||||
templates = get_flair_templates(reddit)
|
||||
for template in templates:
|
||||
# check if the flair text is in the template
|
||||
if template["text"] in flair_text:
|
||||
return template
|
||||
|
||||
|
||||
@ -47,7 +105,9 @@ PS: This was an automated messaage, no need to reply. [Reach out to mods](https:
|
||||
|
||||
Namaste 🙏
|
||||
"""
|
||||
reddit.redditor(username).message(subject=message_subject, message=message_text.format(flair=flair_text))
|
||||
reddit.redditor(username).message(
|
||||
subject=message_subject, message=message_text.format(flair=flair_text), from_subreddit=reddit.subreddit(sub)
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
@ -68,9 +128,43 @@ def main():
|
||||
# get flair text from CLI args
|
||||
flair_text = sys.argv[2]
|
||||
|
||||
# get last activity times
|
||||
print(f"Getting last activity times for {reddit_username}...")
|
||||
last_comment_time, last_post_time, last_post_title = get_last_activity_times(reddit, reddit_username)
|
||||
if last_comment_time is not None:
|
||||
print(f"{reddit_username}'s last comment time on developersIndia was {last_comment_time}")
|
||||
if last_post_time is not None:
|
||||
print(f"{reddit_username}'s last post on developersIndia was \"{last_post_title}\" on {last_post_time}")
|
||||
|
||||
|
||||
# get current flair
|
||||
current_flair_text, current_flair_template_id = get_flair(reddit, reddit_username)
|
||||
|
||||
# TODO figure out final flair text
|
||||
if "Verified" in current_flair_text or "YoE" in current_flair_text:
|
||||
print(f"{reddit_username} is already verified")
|
||||
sys.exit(0)
|
||||
|
||||
if current_flair_text is None and current_flair_template_id is None:
|
||||
print(f"{reddit_username} does not have a flair on r/developersIndia")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print(f"{reddit_username}'s current flair is \"{current_flair_text}\", template id: {current_flair_template_id}")
|
||||
|
||||
# ask for user input
|
||||
user_input = input(f"Do you want to verify {reddit_username}? [Y/n]: ")
|
||||
if user_input.lower() != 'y':
|
||||
print("Cancelled verification operation.")
|
||||
sys.exit(0)
|
||||
|
||||
assign_user_flair(reddit, reddit_username, flair_text)
|
||||
# send_message(reddit, reddit_username)
|
||||
# Ya I know, just don't ask
|
||||
time.sleep(2)
|
||||
updated_flair_text, _ = get_flair(reddit, reddit_username)
|
||||
print(f"Updated {reddit_username}'s flair to \"{updated_flair_text}\"")
|
||||
send_message(reddit, reddit_username, updated_flair_text)
|
||||
print(f"Sent verification confirmation message to {reddit_username}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
main()
|
||||
|
1
verifier/requirements.txt
Normal file
1
verifier/requirements.txt
Normal file
@ -0,0 +1 @@
|
||||
praw
|
60
wiki-mention/main.py
Normal file
60
wiki-mention/main.py
Normal file
@ -0,0 +1,60 @@
|
||||
import praw
|
||||
import os
|
||||
|
||||
# Reddit API credentials
|
||||
client_id = os.environ["REDDIT_CLIENT_ID"]
|
||||
client_secret = os.environ["REDDIT_CLIENT_SECRET"]
|
||||
reddit_pass = os.environ["REDDIT_PASSWORD"]
|
||||
username = os.environ["REDDIT_USERNAME"]
|
||||
user_agent = "Wiki Mention Notifier"
|
||||
sub = "developersIndia"
|
||||
|
||||
# Create a Reddit instance
|
||||
reddit = praw.Reddit(
|
||||
client_id=client_id,
|
||||
client_secret=client_secret,
|
||||
password=reddit_pass,
|
||||
user_agent=user_agent,
|
||||
username=username,
|
||||
)
|
||||
|
||||
def send_message(reddit, username):
|
||||
message_subject = 'Woohoo! Your advice/perspective is now part of our wiki!'
|
||||
message_text = """
|
||||
Hi there,\n
|
||||
It looks like one of your comments on r/developersIndia was picked-up by the volunteer team to be part of our **[community-driven wiki](https://wiki.developersindia.in/)**.\n
|
||||
|
||||
- You can find your contribution by searching your username in the [Wiki](https://wiki.developersindia.in/).\n
|
||||
- We can't thank you enough for your valuable contribution to our community 🧡\n\n
|
||||
|
||||
Please keep contributing productively. If you have any questions/concerns feel free to reply to this mail or create a new modmail.\n\n
|
||||
|
||||
Cheers,\n
|
||||
The r/developersIndia Community Team
|
||||
"""
|
||||
reddit.redditor(username).message(
|
||||
subject=message_subject, message=message_text, from_subreddit=reddit.subreddit(sub)
|
||||
)
|
||||
|
||||
|
||||
def add_mod_note_good_contributor(reddit, username):
|
||||
subreddit = reddit.subreddit(sub)
|
||||
subreddit.mod.notes.create(
|
||||
redditor=username,
|
||||
label="HELPFUL_USER",
|
||||
note="Their advice/perspective was mentioned in our wiki.",
|
||||
)
|
||||
|
||||
def main():
|
||||
if len(os.sys.argv) != 2:
|
||||
print("Usage: python main.py <username>")
|
||||
return
|
||||
|
||||
reddit_username = os.sys.argv[1]
|
||||
|
||||
send_message(reddit, reddit_username)
|
||||
add_mod_note_good_contributor(reddit, reddit_username)
|
||||
print(f"Sent wiki mention modmail to {reddit_username}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Reference in New Issue
Block a user