mirror of
https://github.com/developersIndia/deviras.git
synced 2025-05-31 14:11:43 +05:30
Compare commits
26 Commits
community-
...
2824227ac9
Author | SHA1 | Date | |
---|---|---|---|
|
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 |
@@ -33,7 +33,7 @@
|
|||||||
"test"
|
"test"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"login": "git-bruh",
|
"login": "git-bruh",
|
||||||
"name": "Pratham",
|
"name": "Pratham",
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/67585967?v=4",
|
"avatar_url": "https://avatars.githubusercontent.com/u/67585967?v=4",
|
||||||
@@ -59,6 +59,15 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"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,
|
"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:
|
on:
|
||||||
# schedule:
|
schedule:
|
||||||
# Every 2 hours”
|
# Run every 24 hours at 00:00 UTC
|
||||||
# - cron: '0 */2 * * *'
|
- cron: "0 0 * * *"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Set up Python 3.10
|
- name: Set up Python 3.10
|
||||||
uses: actions/setup-python@v3
|
uses: actions/setup-python@v3
|
||||||
with:
|
with:
|
||||||
python-version: "3.10"
|
python-version: "3.10"
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||||
- name: Update Learderboard
|
- name: Update Leaderboard
|
||||||
env:
|
env:
|
||||||
REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
|
REDDIT_CLIENT_ID: ${{ secrets.REDDIT_CLIENT_ID }}
|
||||||
REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
|
REDDIT_CLIENT_SECRET: ${{ secrets.REDDIT_CLIENT_SECRET }}
|
||||||
REDDIT_PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
|
REDDIT_PASSWORD: ${{ secrets.REDDIT_PASSWORD }}
|
||||||
REDDIT_USERNAME: ${{ secrets.REDDIT_USERNAME }}
|
REDDIT_USERNAME: ${{ secrets.REDDIT_USERNAME }}
|
||||||
AOC_SESSION_COOKIE: ${{ secrets.AOC_SESSION_COOKIE }}
|
AOC_SESSION_COOKIE: ${{ secrets.AOC_SESSION_COOKIE }}
|
||||||
AOC_LEADERBOARD_CODE: ${{ secrets.AOC_LEADERBOARD_CODE }}
|
AOC_LEADERBOARD_CODE: ${{ secrets.AOC_LEADERBOARD_CODE }}
|
||||||
REDDIT_POST_ID: ${{ secrets.REDDIT_POST_ID }}
|
AOC_LEADERBOARD_REDDIT_POST_ID: ${{ secrets.AOC_LEADERBOARD_REDDIT_POST_ID }}
|
||||||
run: |
|
AOC_YEAR: ${{ secrets.AOC_YEAR }}
|
||||||
cd aoc
|
run: |
|
||||||
python main.py
|
cd aoc
|
||||||
|
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 type checker
|
||||||
.pyre/
|
.pyre/
|
||||||
|
|
||||||
|
*.csv
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
### [community-threads](https://github.com/developersIndia/deviras/blob/main/community-threads/main.py)
|
### [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)
|
||||||
@@ -79,10 +79,10 @@ 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://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://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://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://reddit.com/u/LinearArray"><img src="https://i.imgur.com/NTzygIr.jpeg" 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://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>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<!-- markdownlint-restore -->
|
<!-- markdownlint-restore -->
|
||||||
|
16
aoc/main.py
16
aoc/main.py
@@ -6,20 +6,21 @@ client_id = os.environ["REDDIT_CLIENT_ID"]
|
|||||||
client_secret = os.environ["REDDIT_CLIENT_SECRET"]
|
client_secret = os.environ["REDDIT_CLIENT_SECRET"]
|
||||||
reddit_pass = os.environ["REDDIT_PASSWORD"]
|
reddit_pass = os.environ["REDDIT_PASSWORD"]
|
||||||
username = os.environ["REDDIT_USERNAME"]
|
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_session_cookie = os.environ["AOC_SESSION_COOKIE"]
|
||||||
aoc_leaderboard_code = os.environ["AOC_LEADERBOARD_CODE"]
|
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():
|
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()
|
data = response.json()
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def format_leaderboard(data, num_players=100):
|
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 += "| Rank | Player | Stars | Score |\n"
|
||||||
leaderboard_stats += "|------|--------|-------|-------|\n"
|
leaderboard_stats += "|------|--------|-------|-------|\n"
|
||||||
|
|
||||||
@@ -32,7 +33,6 @@ def format_leaderboard(data, num_players=100):
|
|||||||
if member_data['local_score'] > 0:
|
if member_data['local_score'] > 0:
|
||||||
leaderboard_stats += f"| {i + 1} | {member_data['name']} | {member_data['stars']} | {member_data['local_score']} |\n"
|
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"
|
leaderboard_stats += f"\nUpdated every 24 hours"
|
||||||
|
|
||||||
return leaderboard_stats
|
return leaderboard_stats
|
||||||
@@ -43,7 +43,7 @@ def update_reddit_post(reddit, post_id, new_stats):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
if not reddit_post_id:
|
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
|
return
|
||||||
|
|
||||||
reddit = praw.Reddit(
|
reddit = praw.Reddit(
|
||||||
@@ -55,9 +55,7 @@ def main():
|
|||||||
)
|
)
|
||||||
|
|
||||||
leaderboard_data = get_leaderboard_data()
|
leaderboard_data = get_leaderboard_data()
|
||||||
|
|
||||||
formatted_stats = format_leaderboard(leaderboard_data)
|
formatted_stats = format_leaderboard(leaderboard_data)
|
||||||
|
|
||||||
update_reddit_post(reddit, reddit_post_id, formatted_stats)
|
update_reddit_post(reddit, reddit_post_id, formatted_stats)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@@ -1,27 +1,28 @@
|
|||||||
# AoC Private Leaderboard Stats Updater Script for Reddit
|
# AoC Private Leaderboard Stats Updater Script for Reddit
|
||||||
|
|
||||||
## Required Environment Variables
|
## Required Environment Variables
|
||||||
|
|
||||||
|
1. `REDDIT_CLIENT_ID`: Reddit API client ID.
|
||||||
1. `REDDIT_CLIENT_ID`: Reddit API client ID.
|
2. `REDDIT_CLIENT_SECRET`: Reddit API client secret.
|
||||||
2. `REDDIT_CLIENT_SECRET`: Reddit API client secret.
|
3. `REDDIT_PASSWORD`: Reddit account password.
|
||||||
3. `REDDIT_PASSWORD`: Reddit account password.
|
4. `REDDIT_USERNAME`: Reddit account username.
|
||||||
4. `REDDIT_USERNAME`: Reddit account username.
|
5. `AOC_SESSION_COOKIE`: Session cookie for the Advent of Code website.
|
||||||
5. `AOC_SESSION_COOKIE`: Session cookie for the Advent of Code website.
|
6. `AOC_LEADERBOARD_CODE`: Code for the Advent of Code leaderboard.
|
||||||
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.
|
||||||
7. `REDDIT_POST_ID`: ID of Reddit post which is used as leaderboard.
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
## Instructions on how to get `AOC_SESSION_COOKIE`
|
## Instructions on how to get `AOC_SESSION_COOKIE`
|
||||||
|
|
||||||
1. **Create an Advent of Code Account:**
|
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.
|
- 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**
|
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.
|
- 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:**
|
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.
|
- 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:**
|
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.
|
- 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:**
|
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.
|
- 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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -27,7 +27,7 @@ def get_posts_by_flair(subreddit, flair):
|
|||||||
posts = []
|
posts = []
|
||||||
for post in subreddit.search(f'flair_name:"{flair}"', time_filter="month"):
|
for post in subreddit.search(f'flair_name:"{flair}"', time_filter="month"):
|
||||||
post_date = datetime.datetime.fromtimestamp(post.created_utc)
|
post_date = datetime.datetime.fromtimestamp(post.created_utc)
|
||||||
if post_date.year == current_year and post_date.month == current_month:
|
if post_date.year == current_year and post_date.month == current_month and post.selftext != '[deleted]':
|
||||||
post.title = post.title.replace("|", "\\|") # Escape the "|" character
|
post.title = post.title.replace("|", "\\|") # Escape the "|" character
|
||||||
posts.append(post)
|
posts.append(post)
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ def get_i_made_this_posts(subreddit):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Return only the top 10 posts
|
# Return only the top 10 posts
|
||||||
return posts[:10]
|
return posts[:20]
|
||||||
|
|
||||||
|
|
||||||
def get_announcement_posts(subreddit):
|
def get_announcement_posts(subreddit):
|
||||||
@@ -88,6 +88,16 @@ def get_announcement_posts(subreddit):
|
|||||||
return get_posts_by_flair(subreddit, flair["flair_text"])
|
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):
|
def get_gist_content(gist_id):
|
||||||
headers = {
|
headers = {
|
||||||
"Authorization": f"token {token}",
|
"Authorization": f"token {token}",
|
||||||
@@ -125,6 +135,7 @@ def create_community_roundup_post(
|
|||||||
weekly_discussion_posts,
|
weekly_discussion_posts,
|
||||||
ama_posts,
|
ama_posts,
|
||||||
announcement_posts,
|
announcement_posts,
|
||||||
|
collab_posts,
|
||||||
):
|
):
|
||||||
flair = next(
|
flair = next(
|
||||||
filter(
|
filter(
|
||||||
@@ -133,7 +144,7 @@ def create_community_roundup_post(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
title = "Community Roundup: List of must read posts & discussions that happened this month - {month} {year}".format(
|
title = "Community Roundup: List of interesting discussions that happened in {month} {year}".format(
|
||||||
month=datetime.date.today().strftime("%B"), year=datetime.date.today().year
|
month=datetime.date.today().strftime("%B"), year=datetime.date.today().year
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -145,21 +156,21 @@ The collection is curated by our volunteer team & is independent of the number o
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if len(announcement_posts) > 0:
|
if len(announcement_posts) > 0:
|
||||||
text = "## Announcements\n||\n|--------|\n"
|
text = "## Announcements\n|Announcements from volunteer team|\n|--------|\n"
|
||||||
for post in announcement_posts:
|
for post in announcement_posts:
|
||||||
text += f"| [**{post.title}**]({post.url}) |\n"
|
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||||
else:
|
else:
|
||||||
print("No announcements found. Skipping")
|
print("No announcements found. Skipping")
|
||||||
|
|
||||||
if len(ama_posts) > 0:
|
if len(ama_posts) > 0:
|
||||||
text += "\n## AMAs\n||\n|--------|\n"
|
text += "\n## AMAs\n|Read insights from guests that joined us for a day |\n|--------|\n"
|
||||||
for post in ama_posts:
|
for post in ama_posts:
|
||||||
text += f"| [**{post.title}**]({post.url}) |\n"
|
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||||
else:
|
else:
|
||||||
print("No AMAs found. Skipping")
|
print("No AMAs found. Skipping")
|
||||||
|
|
||||||
if len(posts) > 0:
|
if len(posts) > 0:
|
||||||
text += "\n## Community Threads\n|S.No|Discussions started by members|\n|--------|--------|\n"
|
text += "\n## Community Threads\n|S.No|Insightful discussions started by community members|\n|--------|--------|\n"
|
||||||
posts_counter = 0
|
posts_counter = 0
|
||||||
for post in posts:
|
for post in posts:
|
||||||
posts_counter += 1
|
posts_counter += 1
|
||||||
@@ -168,16 +179,24 @@ The collection is curated by our volunteer team & is independent of the number o
|
|||||||
print("No posts found in the collection for this month. Skipping")
|
print("No posts found in the collection for this month. Skipping")
|
||||||
|
|
||||||
if len(weekly_discussion_posts) > 0:
|
if len(weekly_discussion_posts) > 0:
|
||||||
text += "\n## Weekly Discussions\n|Started by Volunteer/Mod Team|\n|--------|\n"
|
text += "\n## Weekly Discussions\n|Weekly tech discussions started by Volunteer Team|\n|--------|\n"
|
||||||
for post in weekly_discussion_posts:
|
for post in weekly_discussion_posts:
|
||||||
text += f"| [**{post.title}**]({post.url}) |\n"
|
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||||
else:
|
else:
|
||||||
print("No weekly discussions found. Skipping")
|
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:
|
if len(i_made_this_posts) > 0:
|
||||||
text += "\n## I Made This\n|Top 10 posts|\n|--------|\n"
|
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:
|
for post in i_made_this_posts:
|
||||||
text += f"| [**{post.title}**]({post.url}) |\n"
|
text += f"| [**{post.title.strip()}**]({post.url}) |\n"
|
||||||
else:
|
else:
|
||||||
print("No I Made This posts found. Skipping")
|
print("No I Made This posts found. Skipping")
|
||||||
|
|
||||||
@@ -213,8 +232,9 @@ def main():
|
|||||||
weekly_discussion_posts = get_weekly_discussion_posts(subreddit)
|
weekly_discussion_posts = get_weekly_discussion_posts(subreddit)
|
||||||
ama_posts = get_ama_posts(subreddit)
|
ama_posts = get_ama_posts(subreddit)
|
||||||
announcement_posts = get_announcement_posts(subreddit)
|
announcement_posts = get_announcement_posts(subreddit)
|
||||||
|
collab_posts = code_collaboration_posts(subreddit)
|
||||||
create_community_roundup_post(
|
create_community_roundup_post(
|
||||||
subreddit, posts, i_made_this_posts, weekly_discussion_posts, ama_posts, announcement_posts
|
subreddit, posts, i_made_this_posts, weekly_discussion_posts, ama_posts, announcement_posts, collab_posts
|
||||||
)
|
)
|
||||||
print("Community Roundup post created successfully!")
|
print("Community Roundup post created successfully!")
|
||||||
else:
|
else:
|
||||||
|
@@ -49,12 +49,11 @@ def send_message(reddit, username, post_link):
|
|||||||
message_subject = 'Woohoo! Your post is now part of our community threads collection!'
|
message_subject = 'Woohoo! Your post is now part of our community threads collection!'
|
||||||
message_text = """
|
message_text = """
|
||||||
Hi there,\n
|
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 100+ amazing discussing in the community.\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
|
- 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 in [Community Roundups](https://www.reddit.com/r/developersIndia/?f=flair_name%3A%22Community%20Roundup%22). Stay tuned for the next one!\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
|
||||||
|
|
||||||
> 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.
|
|
||||||
|
|
||||||
Cheers,\n
|
Cheers,\n
|
||||||
The r/developersIndia Community Team
|
The r/developersIndia Community Team
|
||||||
@@ -74,7 +73,7 @@ def get_post_data(reddit, post_url):
|
|||||||
submission.created_utc
|
submission.created_utc
|
||||||
).isoformat(),
|
).isoformat(),
|
||||||
"flair_text": submission.link_flair_text,
|
"flair_text": submission.link_flair_text,
|
||||||
"author": submission.author.name,
|
"author": submission.author.name if submission.author else "",
|
||||||
}
|
}
|
||||||
return post
|
return post
|
||||||
|
|
||||||
@@ -155,8 +154,12 @@ def main():
|
|||||||
update_gist(gist_id, "collection.json", json.dumps(collection_json, indent=4))
|
update_gist(gist_id, "collection.json", json.dumps(collection_json, indent=4))
|
||||||
print("Internal database updated successfully!")
|
print("Internal database updated successfully!")
|
||||||
update_wiki(reddit, "community-threads", posts)
|
update_wiki(reddit, "community-threads", posts)
|
||||||
send_message(reddit, new_post["author"], new_post["url"])
|
if new_post["author"]:
|
||||||
print("Message sent to the 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:
|
else:
|
||||||
print("Post is already in the collection. No changes were made.")
|
print("Post is already in the collection. No changes were made.")
|
||||||
|
|
||||||
|
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": [
|
"titles": [
|
||||||
"wrestling with Jira",
|
"wrestling with Jira",
|
||||||
"trapped in endless meetings",
|
"trapped in endless meetings",
|
||||||
"exterminating code critters",
|
|
||||||
"centering divs for fun",
|
"centering divs for fun",
|
||||||
"impatiently waiting on staging",
|
"impatiently waiting on staging",
|
||||||
"crafting elegant tests",
|
"crafting elegant tests",
|
||||||
"yolo pushing to prod",
|
"yolo pushing to prod",
|
||||||
"code review detectives",
|
|
||||||
"assassinating Jira tickets",
|
"assassinating Jira tickets",
|
||||||
"forging majestic pull requests",
|
"forging majestic pull requests",
|
||||||
"DB migration amnesiacs",
|
"DB migration amnesiacs",
|
||||||
"lgtm",
|
"LGTM",
|
||||||
"staging environment warriors",
|
"staging environment warriors",
|
||||||
"taming wild git branches",
|
"taming wild git branches",
|
||||||
"unleashing the MVP",
|
"unleashing the MVP",
|
||||||
"Jira ticket treasure hunters",
|
"jira ticket treasure hunters",
|
||||||
"merge conflict negotiators",
|
"merge conflict negotiators",
|
||||||
"absorbing knowledge transfer",
|
"absorbing KTs",
|
||||||
"purging container hoarders",
|
"purging container hoarders",
|
||||||
"bug creators and breadwinners",
|
"bug creators and breadwinners",
|
||||||
"DSA explorers",
|
|
||||||
"escaping Vim's clutches",
|
|
||||||
"indexing database maestros",
|
|
||||||
"YAML whisperers",
|
|
||||||
"debugging code in dreams",
|
"debugging code in dreams",
|
||||||
"refactoring like it's an art",
|
"refactoring like it's an art",
|
||||||
"living on Stack Overflow",
|
"living on Stack Overflow",
|
||||||
@@ -42,6 +36,13 @@
|
|||||||
"refining their Google-fu",
|
"refining their Google-fu",
|
||||||
"upgrading their tech stacks",
|
"upgrading their tech stacks",
|
||||||
"writing self-documenting code",
|
"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"
|
SUBREDDIT = "developersindia"
|
||||||
|
|
||||||
POST_FLAIR = "Hiring"
|
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 = """\
|
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/
|
- 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/).
|
||||||
For all the available job openings, check out the Job Board at:- 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!\
|
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!\
|
||||||
"""
|
"""
|
||||||
|
@@ -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)
|
title = "Showcase Sunday Megathread - {month} {year}".format(month=datetime.date.today().strftime("%B"), year=datetime.date.today().year)
|
||||||
text = """
|
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.
|
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(
|
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}")
|
# print(f"Total count of user-flairs: {total_count + emoji_flair_count + old_flairs_total_count}")
|
||||||
|
|
||||||
data = {
|
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 supported text flairs': f"**{total_count}**",
|
||||||
'Users with emoji only flairs': f"**{emoji_flair_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}**"
|
'Total count of user-flairs': f"**{total_count + emoji_flair_count + old_flairs_total_count}**"
|
||||||
|
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