newbies.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from __future__ import annotations
  2. import datetime
  3. import itertools
  4. import sys
  5. import typing
  6. import httpx
  7. import cache
  8. def main() -> None:
  9. since = sys.argv[1] + 'T00:00:00Z'
  10. codes: dict[str, str] = {company['UserName'].casefold(): company['CompanyCode']
  11. for company in cache.get('https://rest.fnar.net/company/all') if company['UserName'] is not None}
  12. planets = ['Avalon', 'Berthier', 'Boucher', 'Nova Honshu', 'Promitor']
  13. joined: dict[str, int] = {}
  14. for planet in planets:
  15. print('querying', planet, 'chat...', file=sys.stderr)
  16. messages: typing.Sequence[Message] = httpx.get('https://api.fnar.net/chat/messages',
  17. params={'channel_names': planet + ' Global Site Owners', 'updated_since': since}).raise_for_status().json()
  18. for message in messages:
  19. if message['Type'] == 'JOINED':
  20. old_join = joined.get(message['SenderUserName'])
  21. if old_join is None or old_join > message['MessageTimestamp']:
  22. joined[message['SenderUserName']] = message['MessageTimestamp']
  23. relevant_cos = {co for username in joined.keys() if (co := codes.get(username))}
  24. rep: dict[str, int] = {}
  25. for co_batch in itertools.batched(relevant_cos, 10):
  26. companies = httpx.get('https://api.fnar.net/company/lookup?' + '&'.join(f'company={co}' for co in co_batch)).raise_for_status().json()
  27. for company in companies:
  28. if company is not None:
  29. rep[company['UserName'].casefold()] = company['Reputation']
  30. for username, join_ts in sorted(joined.items(), key=lambda i: i[1]):
  31. join_str = datetime.datetime.fromtimestamp(join_ts/1000, tz=datetime.UTC).strftime('%Y-%m-%d %H:%M:%S')
  32. print(username, join_str, '', '', rep.get(username, ''), sep='\t')
  33. class Message(typing.TypedDict):
  34. Type: typing.Literal['JOINED', 'LEFT', 'MESSAGE']
  35. SenderUserName: str
  36. MessageTimestamp: int
  37. if __name__ == '__main__':
  38. main()