|
|
@@ -4,6 +4,7 @@ import datetime
|
|
|
import itertools
|
|
|
import sys
|
|
|
import typing
|
|
|
+import urllib.parse
|
|
|
|
|
|
import httpx
|
|
|
|
|
|
@@ -11,15 +12,17 @@ import cache
|
|
|
|
|
|
def main() -> None:
|
|
|
since = sys.argv[1] + 'T00:00:00Z'
|
|
|
+ c = httpx.Client()
|
|
|
|
|
|
codes: dict[str, str] = {company['UserName'].casefold(): company['CompanyCode']
|
|
|
- for company in cache.get('https://rest.fnar.net/company/all') if company['UserName'] is not None}
|
|
|
+ for company in cache.get('https://rest.fnar.net/company/all', expiry=datetime.timedelta(hours=1))
|
|
|
+ if company['UserName'] is not None}
|
|
|
|
|
|
planets = ['Avalon', 'Berthier', 'Boucher', 'Nova Honshu', 'Promitor']
|
|
|
joined: dict[str, int] = {}
|
|
|
for planet in planets:
|
|
|
print('querying', planet, 'chat...', file=sys.stderr)
|
|
|
- messages: typing.Sequence[Message] = httpx.get('https://api.fnar.net/chat/messages',
|
|
|
+ messages: typing.Sequence[Message] = c.get('https://api.fnar.net/chat/messages',
|
|
|
params={'channel_names': planet + ' Global Site Owners', 'updated_since': since}).raise_for_status().json()
|
|
|
for message in messages:
|
|
|
if message['Type'] == 'JOINED':
|
|
|
@@ -28,9 +31,18 @@ def main() -> None:
|
|
|
joined[message['SenderUserName']] = message['MessageTimestamp']
|
|
|
|
|
|
relevant_cos = {co for username in joined.keys() if (co := codes.get(username))}
|
|
|
+ for username in joined.keys():
|
|
|
+ co = codes.get(username)
|
|
|
+ if co is None:
|
|
|
+ response = c.get('https://rest.fnar.net/user/' + urllib.parse.quote(username)).raise_for_status()
|
|
|
+ if response.status_code != 204:
|
|
|
+ co = response.json()['CompanyCode']
|
|
|
+ if co is not None:
|
|
|
+ relevant_cos.add(co)
|
|
|
+
|
|
|
rep: dict[str, int] = {}
|
|
|
for co_batch in itertools.batched(relevant_cos, 10):
|
|
|
- companies = httpx.get('https://api.fnar.net/company/lookup?' + '&'.join(f'company={co}' for co in co_batch)).raise_for_status().json()
|
|
|
+ companies = c.get('https://api.fnar.net/company/lookup?' + '&'.join(f'company={co}' for co in co_batch)).raise_for_status().json()
|
|
|
for company in companies:
|
|
|
if company is not None:
|
|
|
rep[company['UserName'].casefold()] = company['Reputation']
|