Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/core/utils/bot.py

108 lines
3.8 KiB
Python
Raw Normal View History

2021-10-01 01:18:04 +00:00
'''编写机器人时可能会用到的一些工具类方法。'''
2021-04-28 12:21:33 +00:00
import os
2021-07-21 17:58:33 +00:00
import traceback
2021-07-27 17:42:47 +00:00
import uuid
2021-08-07 07:56:48 +00:00
from os.path import abspath
2021-10-01 01:18:04 +00:00
from typing import Union
2021-04-27 15:01:17 +00:00
2021-02-06 16:30:13 +00:00
import aiohttp
2021-07-21 17:58:33 +00:00
import filetype as ft
2021-09-10 18:05:27 +00:00
import ujson as json
2021-08-25 14:32:37 +00:00
from aiohttp_retry import ExponentialRetry, RetryClient
2021-02-06 16:30:13 +00:00
2021-10-14 15:29:45 +00:00
from core.elements import FetchTarget, PrivateAssets
2021-10-14 15:18:47 +00:00
from core.loader import load_modules
2021-11-12 14:25:53 +00:00
from core.logger import Logger
2021-04-28 12:21:33 +00:00
2021-08-07 07:56:48 +00:00
2021-10-01 01:18:04 +00:00
def init() -> None:
'''初始化机器人。仅用于bot.py与unit_test.py。'''
2021-10-14 15:18:47 +00:00
load_modules()
2021-08-21 15:58:07 +00:00
version = os.path.abspath(PrivateAssets.path + '/version')
write_version = open(version, 'w')
2021-10-16 05:24:53 +00:00
try:
write_version.write(os.popen('git rev-parse HEAD', 'r').read()[0:6])
except ValueError:
2021-10-16 05:24:53 +00:00
write_version.write('Not a git repo')
2021-08-21 15:58:07 +00:00
write_version.close()
tag = os.path.abspath(PrivateAssets.path + '/version_tag')
write_tag = open(tag, 'w')
2021-10-16 05:24:53 +00:00
try:
write_tag.write(os.popen('git tag -l', 'r').read().split('\n')[-2])
except ValueError:
2021-10-16 10:42:54 +00:00
write_tag.write('v4.?.?')
2021-08-21 15:58:07 +00:00
write_tag.close()
2021-10-02 07:05:50 +00:00
async def get_url(url: str, status_code: int = False, headers: dict = None, fmt=None):
2021-11-12 14:25:53 +00:00
"""利用AioHttp获取指定url的内容。
2021-10-01 01:18:04 +00:00
:param url: 需要获取的url
:param status_code: 指定请求到的状态码若不符则抛出ValueError
2021-10-01 01:18:04 +00:00
:param headers: 请求时使用的http头
:returns: 指定url的内容字符串
2021-11-12 14:25:53 +00:00
"""
2021-08-25 14:32:37 +00:00
async with RetryClient(headers=headers, retry_options=ExponentialRetry(attempts=3)) as session:
2021-02-11 12:41:07 +00:00
async with session.get(url, timeout=aiohttp.ClientTimeout(total=20), headers=headers) as req:
2021-10-02 07:05:50 +00:00
if status_code and req.status != status_code:
raise ValueError(req.status)
if fmt is not None:
if hasattr(req, fmt):
return await getattr(req, fmt)()
else:
raise ValueError(f"NoSuchMethod: {fmt}")
else:
text = await req.text()
return text
2021-04-27 15:01:17 +00:00
async def download_to_cache(link: str) -> Union[str, bool]:
2021-10-01 01:18:04 +00:00
'''利用AioHttp下载指定url的内容并保存到缓存./cache目录
:param link: 需要获取的link
:returns: 文件的相对路径若获取失败则返回False'''
2021-07-21 17:58:33 +00:00
try:
2021-08-25 14:32:37 +00:00
async with RetryClient(retry_options=ExponentialRetry(attempts=3)) as session:
2021-07-21 17:58:33 +00:00
async with session.get(link) as resp:
res = await resp.read()
ftt = ft.match(res).extension
path = abspath(f'./cache/{str(uuid.uuid4())}.{ftt}')
with open(path, 'wb+') as file:
file.write(res)
return path
except:
traceback.print_exc()
return False
2021-07-27 17:42:47 +00:00
def cache_name():
return abspath(f'./cache/{str(uuid.uuid4())}')
2021-10-01 01:18:04 +00:00
async def slk_converter(filepath: str) -> str:
'''将指定文件转为slk格式。
:param filepath: 需要获取的link
:returns: 文件的相对路径'''
2021-07-21 17:58:33 +00:00
filepath2 = filepath + '.silk'
Logger.info('Start encoding voice...')
os.system('python slk_coder.py ' + filepath)
Logger.info('Voice encoded.')
return filepath2
2021-08-19 12:17:48 +00:00
2021-08-21 15:58:07 +00:00
2021-10-01 01:18:04 +00:00
async def load_prompt(bot: FetchTarget) -> None:
2021-08-22 14:55:25 +00:00
author_cache = os.path.abspath(PrivateAssets.path + '/cache_restart_author')
2021-10-14 15:18:47 +00:00
loader_cache = os.path.abspath(PrivateAssets.path + '/.cache_loader')
2021-08-19 12:17:48 +00:00
if os.path.exists(author_cache):
open_author_cache = open(author_cache, 'r')
2021-08-21 15:58:07 +00:00
author = json.loads(open_author_cache.read())['ID']
2021-08-19 12:17:48 +00:00
open_loader_cache = open(loader_cache, 'r')
2021-08-21 15:58:07 +00:00
m = await bot.fetch_target(author)
if m:
await m.sendMessage(open_loader_cache.read())
open_loader_cache.close()
open_author_cache.close()
os.remove(author_cache)
2021-11-12 14:25:53 +00:00
os.remove(loader_cache)