Main account: @UlrikHD@programming.dev
- 2 Posts
- 14 Comments
UlrikHD@lemm.eeOPMto Football@lemm.ee•[meta] Vote on the instance for the community (closes in 2 days) English2·1 day agoCast your vote below this comment
UlrikHD@lemm.eeOPMto Football@lemm.ee•[meta] Discussion on where to migrate the community.English2·2 days agoThe bot isn’t tied to the admin role, I started on it before I became a moderator for !football@lemmy.world
UlrikHD@lemm.eeOPMto Football@lemm.ee•[meta] Discussion on where to migrate the community.English2·2 days agoI never really wanted to be the main moderator in the first place, I’d be happy to let someone else take the responsibility.
I’ll still put up a poll to see what the community at large wants though.
UlrikHD@lemm.eeOPMto Football@lemm.ee•[meta] Discussion on where to migrate the community.English1·2 days agoYes, I’ll give people some more time to discuss before making another post.
I’m all for it, would be happy to help with it
Is it still pinned?
UlrikHD@lemm.eeto Football (Soccer fútbol fußball 足球 )@lemmy.world•[Announcement] Community migration to football@lemm.eeEnglish4·5 months agoIf you need any technical help, you can message me at @UlrikHD@programming.dev
UlrikHD@lemm.eeto Football (Soccer fútbol fußball 足球 )@lemmy.world•[Announcement] Community migration to football@lemm.eeEnglish5·5 months agoWith this script, can you get the list of subcribers ?
I don’t think the Lemmy API exposes the subscriber list of a community, you’ll need access to the instance database.
What I did was checking every post for the last 365 days for user activity and store every user that have interacted with the community.
lemmy_session and lemmy_references are the same as for the LiveThreadBot (inside the src folder): https://gitlab.com/UlrikHD/lemmy-match-thread-bot
get_posts() may be missing from the lemmy_session.py file though
def get_posts(self, *, community: int | str | LemmyCommunity, sort: str = 'New', page: int = 1) -> dict[str, any]: """ Gets the posts of a community. :param community: The ID of the community to get the posts of, can also be a LemmyCommunity parseable string/object. :param sort: The sorting method of the posts, by default 'New'. :param page: The page number of the posts, by default 1. :return: The response JSON of the request as a dictionary. """ if isinstance(community, LemmyCommunity) or isinstance(community, str): response: Final[requests.Response] = self.srv.get_posts(community_name=community, sort=sort, page=page, limit=50) else: response: Final[requests.Response] = self.srv.get_posts(community_id=community, sort=sort, page=page, limit=50) if response.status_code != 200: raise requests.exceptions.HTTPError(response.text) return response.json()
Excuse the ugly code, it was written as a one-off
import os import time import datetime from json import load, dump import requests from lemmy_references import LemmyCommunity, LemmyUser from lemmy_session import LemmySession session: LemmySession = LemmySession(website='https://lemmy.world/', username='TestUlrikHD', password='---', end_script_signal=None) posts: list[dict[[str, any]]] = [] cutoff_date: datetime.datetime = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=365) page_count: int = 1 loop_break: bool = False while True: post_response: dict[str, any] = session.get_posts(community=LemmyCommunity('football', 'lemmy.world'), page=page_count) page_count += 1 for post in post_response['posts']: if datetime.datetime.fromisoformat(post['post']['published']) > cutoff_date: posts.append(post) else: loop_break = True break if loop_break: break user_dict: dict[str, dict[str, any]] = {} for post in posts: user_dict[str(LemmyUser(post['creator']['actor_id']))] = {'post': True, 'post_id': post['post']['id']} comments = session.get_post_comments(post_id=post['post']['id']) for comment in comments['comments']: user: str = str(LemmyUser(comment['creator']['actor_id'])) if user not in user_dict: user_dict[user] = {'post': False, 'post_id': comment['post']['id'], 'parent_id': comment['comment']['id']} del user_dict[str(LemmyUser('FootballAutoMod@lemmy.world'))] del user_dict[str(LemmyUser('LiveThreadBot@lemmy.world'))] with open('user_dict', 'w', encoding='utf-8') as file: dump(user_dict, file, ensure_ascii=False, indent=4) def log_reply(usr: str) -> None: user_list: list[str] = [] if os.path.isfile('reply_list.json'): with open('reply_list.json', 'r', encoding='utf-8') as file: user_list = load(file) user_list.append(str(usr)) with open('reply_list.json', 'w', encoding='utf-8') as file: dump(user_list, file, ensure_ascii=False, indent=4) for username, user in user_dict.items(): time.sleep(1) try: #if user['post']: # session.reply(content='migration message', post_id=user['post_id'], parent_id=None) #else: # session.reply(content='migration message', post_id=user['post_id'], parent_id=user['parent_id']) log_reply(usr=LemmyUser(username).str_link()) except requests.HTTPError as e: print(f'Failed to send message to {username} - {e}')
and this part creates txt for easy copy pasting for tagging.
from json import load with open('reply_list.json', 'r', encoding='utf-8') as file: user_list: list[str] = load(file) loop_count: int = len(', '.join(user_list)) // 9500 + 1 for i in range(loop_count): with open(f'reply_list_{i}.txt', 'w', encoding='utf-8') as file: print(len(' '.join(user_list[i * len(user_list) // loop_count:(i + 1) * len(user_list) // loop_count]))) file.write(', '.join(user_list[i * len(user_list) // loop_count:(i + 1) * len(user_list) // loop_count]))
UlrikHD@lemm.eeto Football (Soccer fútbol fußball 足球 )@lemmy.world•[Announcement] Community migration to football@lemm.eeEnglish4·5 months agoIf you are referring FootballAutoMod it’s a very basic bot I wrote for posting weekly discussion threads. The tagging of people were just a simple script I wrote to get a list of everyone who have interacted with the community in the last 365 days and then splitting the list up to get within the 10k character limit for comments.
Sure