浏览代码

newbies: refetch company codes

after seeing which companies have no rep data, pulling their data
in-game and sending it to FIO API updates it. but we can't get their
data if we're using cached company codes from /company/all
raylu 1 周之前
父节点
当前提交
fc6dfd704d
共有 1 个文件被更改,包括 15 次插入3 次删除
  1. 15 3
      newbies.py

+ 15 - 3
newbies.py

@@ -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']