Skip to content

Commit

Permalink
query webfinger before mastodon sync
Browse files Browse the repository at this point in the history
  • Loading branch information
Her Email committed Nov 11, 2023
1 parent 4a3d96e commit 9594cb3
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
14 changes: 14 additions & 0 deletions mastodon/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,20 @@ def create_app(domain_name):
return response


def webfinger(site, username) -> dict | None:
url = f"https://{site}/.well-known/webfinger?resource=acct:{username}@{site}"
try:
response = get(url, headers={"User-Agent": USER_AGENT})
if response.status_code != 200:
logger.error(f"Error webfinger {username}@{site} {response.status_code}")
return None
j = response.json()
return j
except Exception:
logger.error(f"Error webfinger {username}@{site}")
return None


# utils below
def random_string_generator(n):
s = string.ascii_letters + string.punctuation + string.digits
Expand Down
19 changes: 19 additions & 0 deletions users/migrations/0015_user_mastodon_last_reachable.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-11-11 05:34

import django.utils.timezone
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("users", "0014_preference_mastodon_skip_relationship_and_more"),
]

operations = [
migrations.AddField(
model_name="user",
name="mastodon_last_reachable",
field=models.DateTimeField(default=django.utils.timezone.now),
),
]
18 changes: 16 additions & 2 deletions users/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ class User(AbstractUser):
mastodon_domain_blocks = models.JSONField(default=list)
mastodon_account = models.JSONField(default=dict)
mastodon_last_refresh = models.DateTimeField(default=timezone.now)
mastodon_last_reachable = models.DateTimeField(default=timezone.now)
# store the latest read announcement id,
# every time user read the announcement update this field
read_announcement_index = models.PositiveIntegerField(default=0)
Expand Down Expand Up @@ -267,9 +268,14 @@ def sync_identity(self):
identity.save()

def refresh_mastodon_data(self):
"""Try refresh account data from mastodon server, return true if refreshed successfully, note it will not save to db"""
"""Try refresh account data from mastodon server, return True if refreshed successfully"""
logger.debug(f"Refreshing Mastodon data for {self}")
self.mastodon_last_refresh = timezone.now()
if not webfinger(self.mastodon_site, self.mastodon_username):
logger.error(f"Unable to fetch web finger for {self}")
self.save(update_fields=["mastodon_last_refresh"])
return False
self.mastodon_last_reachable = timezone.now()
code, mastodon_account = verify_account(self.mastodon_site, self.mastodon_token)
if code == 401 and self.mastodon_refresh_token:
self.mastodon_token = refresh_access_token(
Expand Down Expand Up @@ -317,7 +323,15 @@ def refresh_mastodon_data(self):
elif code == 401:
logger.error(f"Refresh mastodon data error 401 for {self}")
self.mastodon_token = ""
self.save(update_fields=["mastodon_token"])
else:
logger.error(f"Refresh mastodon data error 401 for {self}")
self.save(
update_fields=[
"mastodon_token",
"mastodon_last_refresh",
"mastodon_last_reachable",
]
)
return False

@property
Expand Down

0 comments on commit 9594cb3

Please sign in to comment.