114 Commits

Author SHA1 Message Date
3feccf6755 Update aoc.yml 2025-01-10 00:17:12 +05:30
101b529307 🐛 fix: handle case for no announcements 2024-12-31 22:06:21 +05:30
e9a454fa5a I apologise, my bad 2024-12-06 21:19:53 +05:30
345dc1016e use Annonymous user instead of None 2024-12-05 18:07:37 +05:30
2824227ac9 remove private link 2024-12-01 12:48:14 +05:30
e84b1b18ae fix env reference 2024-12-01 12:45:37 +05:30
a73d956b23 make Advent of Code leaderboard generic (#21) 2024-11-30 10:43:34 +05:30
bcb037076a reduce title noise 2024-11-08 13:43:20 +05:30
8ceaefcce9 improve mail copy 2024-11-06 14:19:06 +05:30
7237ed4e02 new script - wiki mention notifier 2024-11-06 00:07:19 +05:30
ea7b0e8a37 update community threads, auto-message 2024-11-01 20:21:36 +05:30
aeed19753e Update README.md 2024-10-18 22:30:40 +05:30
87cd738f3e update hiring post title to mega-thread 2024-10-17 22:11:40 +05:30
676744cb6f fix newline issues in community roundup post description 2024-10-04 19:54:30 +05:30
3b6d74c683 fix typo 2024-09-14 18:07:34 +05:30
282d02d000 dont message if empty use 2024-08-15 16:21:34 +05:30
7c90a350e9 fix empty user 2024-08-15 16:17:47 +05:30
24be5dcd82 add link to i made this and showcase sunday 2024-08-15 15:01:16 +05:30
bcd0648167 ignore csv fiels 2024-07-29 13:39:25 +05:30
50a57664ba increase projects count to 20 + filter deleted posts 2024-07-29 13:39:25 +05:30
44d765927c fix lineararray image (link broke due to username change) 2024-07-17 19:59:26 +05:30
069293ea5e remove un-necessary stuff 2024-07-12 14:59:47 +05:30
4e26a3f764 add more relatable titles! 2024-07-08 14:29:28 +05:30
17967c3b95 upto post title format for community roundups 2024-05-13 14:03:50 +05:30
10ce6e5528 rollback to default permissions for discord bot 2024-05-13 14:01:54 +05:30
f2b11ddd21 Update README.md 2024-05-06 20:08:51 +05:30
e5b36db49f 🎨 lint scripts, readme 2024-05-05 15:00:53 +05:30
fe0c6a6a57 docs: add Rancho-rachit as a contributor for code (#20)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-05-05 14:47:54 +05:30
8c5ecda424 ADD: Automation script for Scheduled events on Discord_Server and Google_Calender both. (#18) 2024-05-05 14:46:49 +05:30
21fce6828b add code collab posts in monthly community roundups (#19) 2024-04-29 14:23:27 +05:30
58746803ee Update README.md 2024-04-14 19:09:54 +05:30
518f650160 Update README.md 2024-04-14 19:07:29 +05:30
1dad8740e6 strip extra space from title 2024-04-13 18:24:49 +05:30
2df84308dd update notification message 2024-04-10 14:02:54 +05:30
512a469fde use permalink for post + send a message to user 2024-03-27 12:10:11 +05:30
ed2e865492 Update .all-contributorsrc 2024-03-26 07:03:42 +05:30
dc7a04b9b1 Update README.md 2024-03-05 13:50:31 +05:30
3b32cb1909 Update main.py (#15) 2024-03-05 13:35:01 +05:30
dc31a18089 🐛 fix flair update in verifier

2024-03-03 21:04:31 +05:30
dbe8db8816 🐛 fix missing announcement posts from roundup 2024-02-29 11:17:39 +05:30
7419fee0bd fix the year count in threads wiki 2024-02-25 14:30:58 +05:30
4325ecc230 remove reading reddit collection for community threads collection (#16) 2024-02-25 14:21:15 +05:30
e41335edc3 add support for listing announcements in roundup post 2024-02-15 13:28:17 +05:30
bd986018d2 add separate requirements file 2024-02-14 14:36:05 +05:30
9f0bf8bfc5 ignore deleted questions from the summarizer 2024-01-21 19:28:58 +05:30
ee24bdcbf6 add ama posts in roundup 2024-01-20 18:51:51 +05:30
1c85fa5adc Add the AMA Summariser - Question & Question Links to Markdown Script (#14) 2024-01-20 16:35:28 +05:30
9cce47796f escape | 2024-01-19 19:39:51 +05:30
5d7700d61b add support for adding weekly discussions and i made this posts 2024-01-19 13:13:26 +05:30
e1e6dbd929 add manual user-input to verify 2024-01-17 20:02:31 +05:30
66ae6427d7 send message via modmail instead of DM 2024-01-17 14:03:38 +05:30
fb06e4287d add user stats in verifier 2024-01-17 13:38:26 +05:30
6b244fa451 rename script 2024-01-17 13:22:24 +05:30
0d562ab223 fix grammar change footer language 2024-01-17 13:20:20 +05:30
1eba42ecd8 remove calendar link, add modmail link 2024-01-16 22:19:04 +05:30
97e90ca32a Community roundup (#13) 2024-01-16 17:46:47 +05:30
92a5d11fbb rename stuff 2024-01-14 20:41:01 +05:30
bfe81b439d approve and distinguish post 2024-01-14 20:39:40 +05:30
cc1b6467c6 remove useless comma from title 2024-01-14 12:41:50 +05:30
9b6f542623 add events link 2024-01-13 16:50:59 +05:30
19efcb83ab add 9pm cron 2024-01-07 20:06:12 +05:30
f7a559aeb7 send data from script 2024-01-07 20:03:12 +05:30
a9cb37dbd3 fix script +action 2024-01-07 19:52:50 +05:30
73ba9c6d81 Update flair-usage-stats.yml 2024-01-07 13:18:58 +05:30
b252f92e02 Update flair-usage-stats.yml 2024-01-07 13:17:22 +05:30
5a18457c55 Create flair-usage-stats.yml 2024-01-07 13:09:06 +05:30
d6fed619fd fix grammar 2024-01-06 00:00:12 +05:30
a606dec66a add modmail link 2024-01-05 23:56:30 +05:30
97adb8a6e8 shift emoji only users into separate list 2024-01-04 16:33:09 +05:30
dd08a66b5d add new script, 2024-01-03 20:20:40 +05:30
201eeace96 use bold instead of code 2024-01-03 12:53:04 +05:30
0b4f522426 change "accidental production saboteurs" to "lgtm" 2024-01-03 01:14:24 +05:30
e620696ec0 fix typo 2024-01-02 17:03:55 +05:30
d5bc01156c ✏️ fix grammar 2024-01-01 20:18:23 +05:30
a40760a63d fix readme & disable AoC cron 2024-01-01 20:16:53 +05:30
d0525e27ba add automation to execute showcae sunday script everyday 2024-01-01 20:00:47 +05:30
753567f319 update wiki descriptive title 2024-01-01 19:26:59 +05:30
0060d1aeed Update README.md 2023-12-31 23:23:46 +05:30
dda14476df add flair to showcase sunday thread 2023-12-28 22:47:40 +05:30
1e4f32431c minor changes 2023-12-28 22:25:58 +05:30
bc372531f2 WIP showcase sunday megathread script 2023-12-27 20:35:31 +05:30
34586d0281 add count of total posts in wiki 2023-12-27 13:02:03 +05:30
d721a6a611 group posts by year 2023-12-27 12:28:27 +05:30
f8087bb256 add code to send dm to verified user 2023-12-26 19:46:46 +05:30
ccb9479aa2 script for verified user flair 2023-12-19 23:52:56 +05:30
74dffe0214 minor changes 2023-12-19 00:40:53 +05:30
ef6dabe4e6 fix token name 2023-12-19 00:38:30 +05:30
a6f3ed1b92 add workflow 2023-12-19 00:35:07 +05:30
c8c1cdd81f save/load data from gist 2023-12-19 00:28:55 +05:30
df213fb36a new scripts & readme 2023-12-16 18:31:34 +05:30
98db840054 add workflow for aoc script 2023-12-02 19:07:23 +05:30
8d9b7a9d34 set max count to 100 users 2023-12-02 18:59:40 +05:30
899674b01c add local score to markdown board 2023-12-01 12:25:43 +05:30
e315e5acce Merge pull request #12 from developersIndia/all-contributors/add-ni5arga
docs: add ni5arga as a contributor for code
2023-11-14 14:43:49 +05:30
3549398fab docs: update .all-contributorsrc [skip ci] 2023-11-14 09:13:35 +00:00
08a32473e3 docs: update README.md [skip ci] 2023-11-14 09:13:34 +00:00
ee3efe7c13 Merge pull request #11 from ni5arga/main
Add script for updating advent of code leaderboard stats
2023-11-14 14:42:48 +05:30
e32aec9b27 Update readme.md 2023-11-14 13:07:03 +05:30
a909135aa0 Create readme.md 2023-11-14 13:06:45 +05:30
aadd308260 Add files via upload 2023-11-14 13:04:55 +05:30
1b4d263a51 markdown table style 2023-11-13 16:30:31 +05:30
1c08df1867 Update main.py 2023-11-13 16:25:50 +05:30
e3224212c3 Create main.py 2023-11-13 15:40:50 +05:30
06f0a269ae enable cron 2023-09-17 19:10:41 +05:30
a82489d0a6 ignore files 2023-09-03 12:48:29 +05:30
13498be553 🐛 ignore ssl check while fetching feed 2023-08-22 22:50:15 +05:30
48e2a025d0 disable cron 2023-07-02 15:08:24 +05:30
2cfb455b64 Update dataset.json 2023-06-16 11:59:56 +05:30
589a47a315 almost there 2023-05-20 14:05:12 +05:30
9d9db1de7f logic to update the yaml doc 2023-04-24 12:19:21 +05:30
d76225cf32 🚧 new script to update automod 2023-04-23 23:44:21 +05:30
e269052344 fix username in titles script 2023-04-23 20:21:16 +05:30
6d80f2b388 Updated with some more funny & edgy titles 2023-04-06 16:52:25 +05:30
98aa67d8a4 Merge pull request #10 from developersIndia/all-contributors/add-git-bruh
docs: add git-bruh as a contributor for code
2023-03-10 13:39:57 +05:30
47 changed files with 1719 additions and 46 deletions

View File

@ -41,6 +41,33 @@
"contributions": [
"code"
]
},
{
"login": "ni5arga",
"name": "Nisarga Adhikary",
"avatar_url": "https://avatars.githubusercontent.com/u/45588772?v=4",
"profile": "https://nisarga.me/",
"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,
@ -49,5 +76,6 @@
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true,
"commitConvention": "angular"
"commitConvention": "angular",
"commitType": "docs"
}

38
.github/workflows/aoc.yml vendored Normal file
View File

@ -0,0 +1,38 @@
name: AoC leaderboard
on:
# schedule:
# Run every 24 hours at 00:00 UTC
# - cron: "0 0 * * *"
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: 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

View File

@ -0,0 +1,37 @@
name : Community Threads Wiki Updater
on:
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
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
View 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

34
.github/workflows/flair-usage-stats.yml vendored Normal file
View File

@ -0,0 +1,34 @@
name: User Flair Usage Stats
on:
schedule:
# Runs every day at 3:30 PM UTC (9 PM IST)
- cron: '30 15 * * *'
workflow_dispatch:
jobs:
send_discord_message:
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: Get Stats
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 }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
run: |
cd user-flair-usage
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
python main.py

35
.github/workflows/showcase-sunday.yml vendored Normal file
View File

@ -0,0 +1,35 @@
name: Showcase Sunday Thread
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: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Create Showcase Sunday Thread
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 showcase-sunday
python main.py

View File

@ -1,14 +1,10 @@
name: r/developersIndia titles updater
name: About Widget Titles Updater
on:
schedule:
# At 19:30 on every 2nd day-of-week.”
- cron: '30 19 * * */2'
workflow_dispatch:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read

35
.github/workflows/wiki-mention.yml vendored Normal file
View 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
View File

@ -127,3 +127,5 @@ dmypy.json
# Pyre type checker
.pyre/
*.csv

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"python.formatting.provider": "black"
}

View File

@ -1,19 +1,42 @@
# deviras
> Bunch of scripts to automate stuff around the developersIndia subreddit
> Bunch of scripts to automate stuff in r/developersIndia.
[![Discord](https://img.shields.io/discord/669880381649977354?color=%237289da&label=Discord&logo=Discord)](https://discordapp.com/invite/MKXMSNC)
[![Subreddit subscribers](https://img.shields.io/reddit/subreddit-subscribers/developersIndia?style=social)](https://www.reddit.com/r/developersIndia/)
[![Subreddit subscribers](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fdevelopersindia.github.io%2Fmetrics%2Fdata%2F&query=%24.totalMembers&suffix=%20members&style=flat&logo=reddit&label=r%2FdevelopersIndia&color=orange&link=https%3A%2F%2Fwww.reddit.com%2Fr%2FdevelopersIndia
)](https://www.reddit.com/r/developersIndia/)
[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg)](#contributors-)
## Scripts
### [idcard_update](https://github.com/developersIndia/deviras/blob/idcard_update)
### [idcard_update](https://github.com/developersIndia/deviras/blob/main/idcard_update/main.py)
Used for changing the text below total members & live members count in a subreddit.
- Used for changing the text below _total members_ & _live members_ count on the Subreddit.
- ![action build](https://github.com/developersIndia/deviras/actions/workflows/titles-updater.yml/badge.svg)
### [aoc](https://github.com/developersIndia/deviras/blob/main/aoc/main.py)
- Used for updating the Advent of Code User Scores in the [leaderboard post](https://www.reddit.com/r/developersIndia/comments/1889ar3/advent_of_code_rdevelopersindia_leaderboard_year/).
- ![action build](https://github.com/developersIndia/deviras/actions/workflows/aoc.yml/badge.svg)
### [community-threads](https://github.com/developersIndia/deviras/blob/main/community-threads/main.py)
- Add a post to [community threads wiki](https://www.reddit.com/r/developersIndia/wiki/community-threads/).
- ![action build](https://github.com/developersIndia/deviras/actions/workflows/collection-thread-updater.yml/badge.svg)
### [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/).
### [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.
- ![action build](https://github.com/developersIndia/deviras/actions/workflows/showcase-sunday.yml/badge.svg)
### [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.
![r/developersIndia About widget](https://user-images.githubusercontent.com/34342551/185678556-e4c911c9-fb12-49da-9ca6-8f8ce2ad9b5a.png)
## Setup
@ -40,9 +63,6 @@ Used for changing the text below total members & live members count in a subredd
python -m unittest
```
## Resources & Learning Material
- [PRAW Docs](https://praw.readthedocs.io/en/stable/code_overview/other/idcard.html)
## Contributors ✨
@ -58,6 +78,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center" valign="top" width="14.28%"><a href="http://pavanjadhaw.me"><img src="https://avatars.githubusercontent.com/u/26551780?v=4?s=100" width="100px;" alt="Pavan Jadhaw"/><br /><sub><b>Pavan Jadhaw</b></sub></a><br /><a href="#ideas-pavanjadhaw" title="Ideas, Planning, & Feedback">🤔</a></td>
<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
View File

@ -0,0 +1 @@
questions.md

65
ama-summarizer/main.py Normal file
View 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
View 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.

View File

@ -0,0 +1 @@
praw

0
aoc/__init__.py Normal file
View File

BIN
aoc/cookie.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

66
aoc/main.py Normal file
View File

@ -0,0 +1,66 @@
import praw
import requests
import os
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 - developersIndia'
aoc_session_cookie = os.environ["AOC_SESSION_COOKIE"]
aoc_leaderboard_code = os.environ["AOC_LEADERBOARD_CODE"]
aoc_year = os.environ.get("AOC_YEAR")
reddit_post_id = os.environ.get("AOC_LEADERBOARD_REDDIT_POST_ID")
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=aoc_year), cookies={'session': aoc_session_cookie})
data = response.json()
return data
def format_leaderboard(data, num_players=100):
leaderboard_stats = f"r/developersIndia Advent of Code {aoc_year} - Leaderboard\n\n"
leaderboard_stats += "| Rank | Player | Stars | Score |\n"
leaderboard_stats += "|------|--------|-------|-------|\n"
# Sort members by stars in descending order
sorted_members = sorted(data['members'].values(), key=lambda x: x['local_score'], reverse=True)
# Include only the top players
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"\nUpdated every 24 hours"
return leaderboard_stats
def update_reddit_post(reddit, post_id, new_stats):
post = reddit.submission(id=post_id)
post.edit(new_stats)
def main():
if not reddit_post_id:
print("Please set the AOC_LEADERBOARD_REDDIT_POST_ID environment variable.")
return
reddit = praw.Reddit(
client_id=client_id,
client_secret=client_secret,
username=username,
password=reddit_pass,
user_agent=user_agent
)
leaderboard_data = get_leaderboard_data()
formatted_stats = format_leaderboard(leaderboard_data)
update_reddit_post(reddit, reddit_post_id, formatted_stats)
if __name__ == "__main__":
main()

45
aoc/readme.md Normal file
View File

@ -0,0 +1,45 @@
# AoC Private Leaderboard Stats Updater Script for Reddit
## 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. `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.
5. **Refresh the Page:**
- Refresh the Advent of Code website. This will trigger various network requests, including the one that authenticates your session.
6. **Look for the Request with the Cookie:**
- In the "Network" tab, look for a network request that is related to the Advent of Code website. It might be named something like "session" or "authenticate."
- Click on this request to view its details.
7. **Find the Cookie Information:**
- In the details of the network request, look for a section named "Request Headers" or "Cookies." You are interested in the value of the `session` cookie.
8. **Copy the Session Cookie Value:**
- Copy the value of the `session` cookie. It is usually a long hex string of letters and numbers.
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.
![session-cookie](https://raw.githubusercontent.com/developersindia/deviras/refs/heads/main/aoc/cookie.png)

View File

@ -0,0 +1 @@
automod.yml

View File

@ -0,0 +1,3 @@
## Learnings
- Make sure the automod file doesn't end with `---`.

View File

@ -0,0 +1,9 @@
{
"filler_text": ">Namaste!\nThanks for submitting to r/developersIndia. Make sure to follow the subreddit [Code of Conduct](https://developersindia.in/code-of-conduct/) while participating in this thread.",
"announcements": [
{
"title": "Announcemnt 1",
"url": "http://www.google.com"
}
]
}

View File

@ -0,0 +1,109 @@
import praw
import os
import json
import re
import ruamel.yaml
from io import StringIO
yaml = ruamel.yaml.YAML()
yaml.default_flow_style = False
sub_name = os.environ["SUBREDDIT_NAME"]
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,
user_agent=f"Automod reader by u/{username}",
username=username,
password=reddit_pass)
# Get the subreddit object
subreddit = reddit.subreddit(sub_name)
def find_automod_wiki():
for wikipage in subreddit.wiki:
if wikipage == f"{sub_name}/config/automoderator":
content = subreddit.wiki["config/automoderator"]
break
if content is None:
print("AutoModerator configuration page not found in the subreddit's wiki")
exit(1)
return content
# Parse the AutoModerator configuration file
def get_automod_rules(content):
# Split the content into sections
config_text = content.content_md
yaml_sections = re.split(r'(?m)^---\n', config_text)[1:]
rules = []
# Parse each YAML section to get the rules
for yaml_text in yaml_sections:
rule = {}
comment_pattern = r"^\s*#\s*(.*)$"
comments = [
match.group(1)
for match in re.finditer(comment_pattern, yaml_text, re.MULTILINE)
]
# Load the YAML data using ruamel.yaml
yaml_data = yaml.load(yaml_text)
if len(comments) > 0:
rule[comments[0]] = yaml_data
rules.append(rule)
return rules
def formatted_announcement(announcements):
announcement_block = ""
announcement_block += f"""{announcements["filler_text"]}\n\n"""
announcement_block += "## Recent Announcements\n\n"
for announcement in announcements["announcements"]:
announcement_block += f"- **[{announcement['title']}]({announcement['url']})**\n"
return announcement_block
def update_automod_rule(rules, announcements):
for rule in rules:
for rulename, config in rule.items():
if rulename == "New post comment":
# print(config)
config["comment"] = announcements
# new_content = yaml.dump(config)
stream = StringIO()
yaml.dump(rules, stream)
yaml_text = stream.getvalue()
stream.close()
print(yaml_text)
# TODO: Update the wiki page with the new content
# subreddit.wiki["config/automoderator"].edit(yaml_text, reason="Update automod comment")
def get_comment():
with open('new_post_automod.yaml', 'r') as file:
yaml_content = file.read()
# Load the YAML content into a Python object
yaml_object = yaml.load(yaml_content, ruamel.yaml.RoundTripLoader)
return yaml_object
# read the announcements from announcements.json
def read_announcements():
with open('announcement.json', 'r') as file:
announcements = json.load(file)
return announcements
content = find_automod_wiki()
announcement = read_announcements()
form_anno = formatted_announcement(announcement)
rules = get_automod_rules(content)
update_automod_rule(rules, form_anno)

246
community-roundup/main.py Normal file
View 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()

View File

@ -0,0 +1,2 @@
praw
requests

View File

168
community-threads/main.py Normal file
View File

@ -0,0 +1,168 @@
import praw
import os
import argparse
from datetime import datetime
import json
from collections import defaultdict
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"]
token = os.environ["GIST_TOKEN"]
gist_id = os.environ["GIST_ID"]
sub = "developersIndia"
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 update_gist(gist_id, filename, content, description=""):
headers = {
"Authorization": f"token {token}",
"Accept": "application/vnd.github.v3+json",
}
data = {"description": description, "files": {filename: {"content": content}}}
response = requests.patch(
f"https://api.github.com/gists/{gist_id}", headers=headers, json=data
)
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
# 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)
)
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
posts_by_year = defaultdict(list)
for post in posts:
year = datetime.strptime(post['created_at'], '%Y-%m-%dT%H:%M:%S').year
posts_by_year[year].append(post)
# Sort posts within each year
for year in posts_by_year:
posts_by_year[year] = sorted(posts_by_year[year], key=lambda k: k['created_at'], reverse=True)
# Calculate total posts and years
total_posts = sum(len(posts) for posts in posts_by_year.values())
total_years = len(posts_by_year)
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-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):
content += f"## {year}\n\n"
# Add the posts for this year
for post in posts_by_year[year]:
formatted_date = datetime.strptime(post['created_at'], '%Y-%m-%dT%H:%M:%S').strftime('%d %b, %Y')
content += f"- `{formatted_date}` [**{post['title']}**]({post['url']})\n\n"
# given a wiki link, update the wiki page with new markdown
wikipage = reddit.subreddit(sub).wiki[wikipage]
wikipage.edit(content=content)
print("Wiki updated successfully!")
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,
username=username,
password=reddit_pass,
user_agent=f"Automod reader by u/{username}",
)
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']}")
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)
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.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("Post is already in the collection. No changes were made.")
if __name__ == "__main__":
main()

17
event-manager/.env.sample Normal file
View 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
View 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.

View 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)

View 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
View 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)

View File

@ -0,0 +1,5 @@
discord.py
google-api-python-client
google-auth-httplib2
google-auth-oauthlib
python-dotenv

10
idcard_update/README.md Normal file
View File

@ -0,0 +1,10 @@
## idcard_update
Used for changing the text below total members & live members count in a subreddit.
![r/developersIndia About widget](https://user-images.githubusercontent.com/34342551/185678556-e4c911c9-fb12-49da-9ca6-8f8ce2ad9b5a.png)
## Resources & Learning Material
- [PRAW Docs](https://praw.readthedocs.io/en/stable/code_overview/other/idcard.html)

View File

@ -1,28 +1,48 @@
{
"titles": [
"ranting about jira",
"siting in a meeting",
"squashing bugs",
"centering divs",
"waiting for staging deployment",
"writing tests",
"pushing directly to prod",
"doing code review",
"deleting jira tickets",
"creating a pull request",
"forgot to run DB migrations",
"broke production",
"running on staging ENV",
"merging git branches",
"releasing the MVP",
"finding jira tickets",
"resolving merge conflicts",
"receiving KT",
"removing unused containers",
"creating bugs to earn bread",
"learning DSA",
"trying to get out of vim",
"making db indexes",
"fixing YAML issues"
"wrestling with Jira",
"trapped in endless meetings",
"centering divs for fun",
"impatiently waiting on staging",
"crafting elegant tests",
"yolo pushing to prod",
"assassinating Jira tickets",
"forging majestic pull requests",
"DB migration amnesiacs",
"LGTM",
"staging environment warriors",
"taming wild git branches",
"unleashing the MVP",
"jira ticket treasure hunters",
"merge conflict negotiators",
"absorbing KTs",
"purging container hoarders",
"bug creators and breadwinners",
"debugging code in dreams",
"refactoring like it's an art",
"living on Stack Overflow",
"mastering regex incantations",
"performing git magic",
"cursing the spaghetti code",
"battling imposter syndrome",
"optimizing for maximum coffee",
"keyboard shortcut ninjas",
"embracing the rubber duck",
"design pattern aficionados",
"missing semicolon sleuths",
"navigating dependency hell",
"tackling time zone torment",
"praying to the CI/CD gods",
"refining their Google-fu",
"upgrading their tech stacks",
"writing self-documenting code",
"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"
]
}

View File

@ -25,8 +25,8 @@ def update_titles():
client_id=client_id,
client_secret=client_secret,
password=reddit_pass,
user_agent="testscript by u/BhupeshV",
username="BhupeshV",
user_agent="Update Titles by u/devsIndiaBot",
username="devsIndiaBot",
)
widgets = reddit.subreddit("developersIndia").widgets
id_card = widgets.id_card

View File

@ -14,18 +14,22 @@ SECONDS_IN_WEEK = 60 * 60 * 24 * 7
# Date Month, Year
STRFTIME_FORMAT = "%d %B, %Y"
import ssl
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
class Config:
DB_PATH = "db.json"
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!\
"""
@ -176,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)

View File

@ -0,0 +1,2 @@
praw
feedparser

View File

@ -1 +1,5 @@
praw
feedparser
pyyaml
ruamel.yaml
requests

69
showcase-sunday/main.py Normal file
View File

@ -0,0 +1,69 @@
import datetime
import praw
import os
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 = 'Showcase Sunday Megathread'
sub = "developersIndia"
def is_second_sunday():
today = datetime.date.today()
first_day_of_month = today.replace(day=1)
day_of_week = first_day_of_month.weekday()
# Calculate the date of the second Sunday
second_sunday = first_day_of_month + datetime.timedelta(days=(6 - day_of_week + 7) % 7 + 7)
return today == second_sunday
def create_showcase_sunday_megathread(subreddit):
flair = next(
filter(
lambda flair: "Showcase Sunday" in flair["flair_text"],
subreddit.flair.link_templates.user_selectable(),
)
)
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. 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.
### [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(
title,
selftext=text,
flair_id=flair["flair_template_id"],
)
submission.mod.approve()
submission.mod.sticky()
submission.mod.distinguish()
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_second_sunday():
create_showcase_sunday_megathread(subreddit)
print("Showcase Sunday Megathread created successfully!")
else:
print("Skipping. Not the second Sunday of the month")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,37 @@
import unittest
import datetime
from main import is_second_sunday
import unittest.mock
# Unit test class
class TestIsSecondSunday(unittest.TestCase):
def test_second_sunday(self):
# Define test cases as a list of tuples containing (input_date, expected_result)
test_cases = [
(datetime.date(2023, 12, 10), True),
(datetime.date(2024, 1, 14), True),
(datetime.date(2024, 2, 11), True),
]
for input_date, expected_result in test_cases:
with unittest.mock.patch("datetime.date") as mock_date:
mock_date.today.return_value = input_date
self.assertEqual(is_second_sunday(), expected_result)
def test_not_second_sunday(self):
# Define test cases as a list of tuples containing (input_date, expected_result)
test_cases = [
(datetime.date(2023, 12, 12), False),
(datetime.date(2023, 12, 5), False),
(datetime.date(2023, 12, 19), False),
]
for input_date, expected_result in test_cases:
with unittest.mock.patch('datetime.date') as mock_date:
mock_date.today.return_value = input_date
self.assertEqual(is_second_sunday(), expected_result)
if __name__ == "__main__":
unittest.main()

86
user-flair-usage/main.py Normal file
View File

@ -0,0 +1,86 @@
import praw
from collections import defaultdict
import os
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"]
webhook_url = os.environ["DISCORD_WEBHOOK_URL"]
user_agent = 'User Flair Usage'
sub = "developersIndia"
# Create a Reddit instance
reddit = praw.Reddit(
client_id=client_id,
client_secret=client_secret,
username=username,
password=reddit_pass,
user_agent=user_agent
)
# Select the subreddit
subreddit = reddit.subreddit(sub)
# Initialize a dictionary to count flairs
flair_count = defaultdict(int)
# Iterate over all the flairs
emoji_flair_count = 0
emoji_flair_users = []
for flair in subreddit.flair(limit=None):
f = flair['flair_text'].strip()
if f.startswith(":") or f.endswith(":"):
emoji_flair_count += 1
emoji_flair_users.append(
dict(
user=flair['user'],
flair_text=f
)
)
else:
flair_count[flair['flair_text'].strip()] += 1
# Convert the dictionary to a list of tuples and sort it by the count
sorted_flairs = sorted(flair_count.items(), key=lambda x: x[1], reverse=True)
# Fetch the list of available user flairs
available_flairs = []
for flair in subreddit.flair.templates:
if not flair['mod_only']:
available_flairs.append(flair['text'].strip())
# Initialize a dictionary to count available flairs
available_flair_count = defaultdict(int)
old_available_flair_count = defaultdict(int)
# Iterate over the sorted flairs
for flair, count in sorted_flairs:
# If the flair is available, increment its count
if flair in available_flairs:
available_flair_count[flair] += count
else:
old_available_flair_count[flair] += count
total_count = sum(available_flair_count.values())
old_flairs_total_count = sum(old_available_flair_count.values())
# print(f"Users with un-supported (old) text flairs: {old_flairs_total_count}")
# print(f"Users with supported text flairs: {total_count}")
# print(f"Users with emoji only flairs: {emoji_flair_count}")
# print(f"Total count of user-flairs: {total_count + emoji_flair_count + old_flairs_total_count}")
data = {
'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}**"
}
formatted_data = "\n".join([f"{k}: {v}" for k, v in data.items()]) # Format the data as a string with each item on a new line
requests.post(webhook_url, json={"content": formatted_data})

View File

@ -0,0 +1,2 @@
praw
requests

170
verifier/main.py Normal file
View File

@ -0,0 +1,170 @@
import os
import sys
import praw
import time
import datetime
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"]
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"])
# 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)
return subreddit.flair.templates
def get_flair_template_from_text(reddit, flair_text):
templates = get_flair_templates(reddit)
for template in templates:
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
def send_message(reddit, username, flair_text):
message_subject = 'Woohoo! You are now a verified member of r/developersIndia! 🚀'
message_text = """
Hi there,\n
As requested your user-flair has now been updated to a verified version. You now have the **{flair}** flair on r/developersIndia ✨\n
This means that you are now a trusted member of the community and we hope that you will continue to contribute to the community in a positive way. \n
As a reminder,\n
- Make sure to follow [Code of Conduct](https://developersindia.in/code-of-conduct/) before participating in discussions.
- Go through [rules](https://www.reddit.com/r/developersIndia/wiki/community-rules/) before creating a new post.\n
If you know someone who is active on r/developersIndia, please send them this [wiki on how to get verified](https://www.reddit.com/r/developersIndia/wiki/verified-flair)\n
\n\n
PS: This was an automated messaage, no need to reply. [Reach out to mods](https://www.reddit.com/message/compose?to=/r/developersIndia) if you have any questions.
Namaste 🙏
"""
reddit.redditor(username).message(
subject=message_subject, message=message_text.format(flair=flair_text), from_subreddit=reddit.subreddit(sub)
)
def main():
reddit = praw.Reddit(
client_id=client_id,
client_secret=client_secret,
username=username,
password=reddit_pass,
user_agent=f"Automod reader by u/{username}",
)
if len(sys.argv) != 3:
print("Usage: python main.py <username> <flair_text>")
sys.exit(1)
# get username from CLI args
reddit_username = sys.argv[1]
# 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)
# 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()

View File

@ -0,0 +1 @@
praw

60
wiki-mention/main.py Normal file
View 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()