Skip to content

Commit 92a62c9

Browse files
committed
feat: allow listing votes for admins
1 parent efdfb80 commit 92a62c9

File tree

4 files changed

+102
-6
lines changed

4 files changed

+102
-6
lines changed

examples/list_post_votes.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
2+
## Get the latest post by user and list its likes. Required admin access
3+
## python examples/post_likes.py db0
4+
5+
import os
6+
import argparse
7+
import json
8+
from pythorhead import Lemmy
9+
10+
11+
arg_parser = argparse.ArgumentParser()
12+
arg_parser.add_argument('username', action="store")
13+
arg_parser.add_argument('-d', '--lemmy_domain', action='store', required=False, type=str, help="the domain in which to look for this user")
14+
arg_parser.add_argument('-u', '--lemmy_username', action='store', required=False, type=str, help="Which user to authenticate as")
15+
arg_parser.add_argument('-p', '--lemmy_password', action='store', required=False, type=str, help="Which password to authenticate with")
16+
args = arg_parser.parse_args()
17+
18+
19+
20+
lemmy_domain = args.lemmy_domain
21+
if not lemmy_domain:
22+
lemmy_domain = os.getenv('LEMMY_DOMAIN', "lemmy.dbzer0.com")
23+
if not lemmy_domain:
24+
raise Exception("You need to provide a lemmy domain via env var or arg")
25+
26+
lemmy_username = args.lemmy_username
27+
if not lemmy_username:
28+
lemmy_username = os.getenv("LEMMY_USERNAME")
29+
30+
lemmy_password = args.lemmy_password
31+
if not lemmy_password:
32+
lemmy_password = os.getenv("LEMMY_PASSWORD")
33+
34+
lemmy = Lemmy(f"https://{lemmy_domain}")
35+
if lemmy_username and lemmy_password:
36+
login = lemmy.log_in(lemmy_username, lemmy_password)
37+
user = lemmy.get_user(username=args.username, return_user_object = True)
38+
if user:
39+
uposts = user.get_latest_posts()
40+
if not len(uposts):
41+
print("User hasn't made any posts")
42+
votes = []
43+
scores = []
44+
more_votes = []
45+
page = 1
46+
# TODO: Make this into a built-in method once a post is a class
47+
while len(more_votes) >= 50 or page == 1:
48+
more_votes = lemmy.post.list_votes(uposts[0]["post"]["id"], page=page).get("post_likes", [])
49+
page += 1
50+
votes += more_votes
51+
for v in more_votes:
52+
scores.append(v["score"])
53+
#print(json.dumps(votes, indent=4))
54+
print(scores)
55+
print(f"{len(votes)} Total votes counted")
56+
else:
57+
print("no matching username found")

pythorhead/classes/user.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class LemmyUser:
2424
matrix_user_id: str | None = None
2525
ban_expires: datetime | None = None
2626
updated: datetime | None = None
27+
comments: list[dict] = None
28+
posts: list[dict] = None
2729
# The owning lemmy instance. We use it to reach the API classes
2830
lemmy = None
2931

@@ -44,13 +46,17 @@ def refresh(self) -> None:
4446
Args:
4547
new_data: Dictionary containing updated user data
4648
"""
47-
new_data = self.lemmy.user.get(person_id=self.person_id)
49+
fresh_data = self.lemmy.user.get(person_id=self.id)
50+
user_dict = fresh_data['person_view']['person']
51+
user_dict['is_admin'] = fresh_data['person_view']['is_admin']
52+
user_dict['comments'] = fresh_data['comments']
53+
user_dict['posts'] = fresh_data['posts']
4854
# Handle datetime conversion
49-
if 'ban_expires' in new_data and new_data['ban_expires']:
50-
new_data['ban_expires'] = datetime.fromisoformat(new_data['ban_expires'])
55+
if 'ban_expires' in user_dict and user_dict['ban_expires']:
56+
user_dict['ban_expires'] = datetime.fromisoformat(user_dict['ban_expires'])
5157

52-
for field_name in new_data:
53-
setattr(self, field_name, new_data[field_name])
58+
for field_name in user_dict:
59+
setattr(self, field_name, user_dict[field_name])
5460

5561

5662
def purge(self) -> None:
@@ -101,4 +107,13 @@ def pm(self, content):
101107
self.lemmy.private_message(
102108
content=content,
103109
recipient_id=self.id,
104-
)
110+
)
111+
112+
def get_latest_posts(self):
113+
self.refresh()
114+
return self.posts
115+
116+
def get_latest_comments(self):
117+
self.refresh()
118+
return self.comments
119+

pythorhead/lemmy.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ def get_user(self, **kwargs) -> LemmyUser | None:
9999
return
100100
user_dict = user_json['person_view']['person']
101101
user_dict['is_admin'] = user_json['person_view']['is_admin']
102+
user_dict['comments'] = user_json['comments']
103+
user_dict['posts'] = user_json['posts']
102104
return LemmyUser.from_dict(user_dict, self)
103105

104106
def search(

pythorhead/post.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ def lock(self, post_id: int, locked: bool) -> Optional[dict]:
298298
"locked": locked,
299299
}
300300
return self._requestor.api(Request.POST, "/post/lock", json=lock_post)
301+
301302
def mark_as_read(self, post_id: int, read: bool) -> Optional[dict]:
302303
"""
303304
@@ -433,3 +434,24 @@ def purge(self, id: int, reason: Optional[str]) -> Optional[dict]:
433434
return self._requestor.api(Request.POST, "/admin/purge/post", json=purge_post)
434435

435436
__call__ = create
437+
438+
439+
def list_votes(self, post_id: int, page: int = 1, limit: int = 50) -> Optional[dict]:
440+
"""
441+
442+
List the likes of a post
443+
444+
Args:
445+
post_id (int)
446+
page (int)
447+
limit (int)
448+
449+
Returns:
450+
Optional[dict]: list of likes if successful
451+
"""
452+
list_votes_params = {
453+
"post_id": post_id,
454+
"page": page,
455+
"limit": limit,
456+
}
457+
return self._requestor.api(Request.GET, "/post/like/list", params=list_votes_params)

0 commit comments

Comments
 (0)