Files
NijiHolo_EN_ID_Bot/src/util.py
T

118 lines
3.4 KiB
Python
Raw Normal View History

2022-09-24 17:56:58 -07:00
## Shared utility functions.
import os
2022-09-27 22:04:26 -07:00
import traceback
import datetime
2022-09-27 02:49:03 -07:00
import pytz
import twint
2022-09-27 22:04:26 -07:00
import twapi
from tweetcapture import TweetCapture
2022-09-25 18:31:50 -07:00
import talent_lists
2022-09-24 17:56:58 -07:00
# returns system path to this project, which is
2022-09-25 18:31:50 -07:00
# up one level from this file's directory (effective path: ..../src/../).
2022-09-24 17:56:58 -07:00
def get_project_dir():
return os.path.join(os.path.dirname(__file__), os.pardir)
def clamp(n, smallest, largest):
return max(smallest, min(n, largest))
2022-09-26 14:44:46 -07:00
def datetime_to_tdate(date_time: datetime.datetime):
return date_time.strftime("%Y-%m-%d")
def tdate_to_datetime(tdate: str):
return datetime.datetime.strptime("%Y-%m-%d")
2022-09-27 02:49:03 -07:00
def timestamp_to_tdate(timestamp=None):
if timestamp==None:
timestamp = datetime.datetime.now().timestamp()
return datetime_to_tdate(datetime.datetime.fromtimestamp(timestamp, tz=pytz.utc))
def get_key_from_value(d, val):
keys = [k for k, v in d.items() if v == val]
if keys:
return keys[0]
return None
async def create_ttweet_image(ttweet):
tc = TweetCapture()
2022-09-27 15:09:09 -07:00
filename = f'{get_project_dir()}/img.png'
url = ttweet_to_url(ttweet)
img = None
try: os.remove(filename)
except: pass
try:
img = await tc.screenshot(
url=url,
path=filename,
mode=4,
night_mode=1
)
except:
print('unable to create tweet image')
return None
else:
print(f'successfully saved {img}')
return img
def ttweet_to_url(ttweet):
2022-09-27 02:49:03 -07:00
username = get_username_online(ttweet.author_id)
return f'https://twitter.com/{username}/status/{ttweet.tweet_id}'
2022-09-27 22:04:26 -07:00
def get_username_local(id):
return talent_lists.talents.get(id, f'{id}')
2022-09-25 18:31:50 -07:00
2022-09-27 22:04:26 -07:00
# twint
# May not work with short user IDs (ie. 1354241437)
# def get_username_online(id, default=None):
# c = twint.Config()
# c.User_id = id
# c.Store_object = True
# c.Hide_output = True
# try:
# twint.output.users_list.clear()
# twint.run.Lookup(c)
# user = twint.output.users_list[0]
# return user.username
# except:
# return str(default) if default is not None else f'{id}'
# API v2 (tweepy)
# Short user IDs (ie. 1354241437) apparently don't work with twint
def get_username_online(id, default=None):
try:
2022-09-27 22:04:26 -07:00
resp = twapi.TwAPI.instance.client.get_user(id=id)
return resp.data.username
except:
2022-09-27 22:04:26 -07:00
print(f'Unhandled error retrieving username for {id}!')
traceback.print_exc()
return str(default) if default is not None else f'{id}'
## Attempt to pull username from local; pull from online if doesn't exist.
def get_username(id):
ret = talent_lists.talents.get(id, None)
if ret == None:
return get_username_online(id)
2022-09-27 02:49:03 -07:00
def get_user_id_local(username) -> int:
talent_usernames = list(talent_lists.talents.values())
for i in range(0, len(talent_usernames)):
if username.lower() == talent_usernames[i].lower():
return list(talent_lists.talents)[i]
def get_user_id_online(username) -> int:
c = twint.Config()
c.Username = username
c.Store_object = True
c.Hide_output = True
try:
twint.output.users_list.clear()
twint.run.Lookup(c)
user = twint.output.users_list[0]
return user.id
except:
return -1