2021-02-19 12:20:00 +00:00
|
|
|
|
import datetime
|
2021-02-19 07:56:47 +00:00
|
|
|
|
import re
|
|
|
|
|
import traceback
|
|
|
|
|
|
2021-02-19 12:20:00 +00:00
|
|
|
|
import aiohttp
|
2021-02-19 07:56:47 +00:00
|
|
|
|
from graia.application import MessageChain
|
2021-06-05 02:00:20 +00:00
|
|
|
|
from graia.application.message.elements.internal import Image, Plain
|
2021-02-19 07:56:47 +00:00
|
|
|
|
|
2021-02-19 12:20:00 +00:00
|
|
|
|
from core import dirty_check as dirty
|
|
|
|
|
from core.template import sendMessage
|
|
|
|
|
|
|
|
|
|
|
2021-02-19 11:44:28 +00:00
|
|
|
|
def time_diff(time: str):
|
|
|
|
|
datetimed = datetime.datetime.strptime(time, '%Y-%m-%dT%H:%M:%SZ').timestamp()
|
|
|
|
|
now = datetime.datetime.now().timestamp()
|
2021-02-19 07:56:47 +00:00
|
|
|
|
diff = now - datetimed
|
|
|
|
|
|
2021-02-19 11:44:28 +00:00
|
|
|
|
diff = diff
|
|
|
|
|
t = diff / 60 / 60 / 24
|
|
|
|
|
dw = ' day(s)'
|
|
|
|
|
if t < 1:
|
|
|
|
|
t = diff / 60 / 60
|
|
|
|
|
dw = ' hour(s)'
|
|
|
|
|
if t < 1:
|
|
|
|
|
t = diff / 60
|
|
|
|
|
dw = ' minute(s)'
|
|
|
|
|
if t < 1:
|
|
|
|
|
t = diff
|
|
|
|
|
dw = ' second(s)'
|
|
|
|
|
diff = str(int(t)) + dw
|
|
|
|
|
return diff
|
|
|
|
|
|
2021-02-19 07:56:47 +00:00
|
|
|
|
|
2021-04-03 13:37:25 +00:00
|
|
|
|
async def dirty_check(text, *whitelist_check):
|
|
|
|
|
whitelist = [
|
|
|
|
|
'Teahouse-Studios',
|
|
|
|
|
'Dianliang233',
|
|
|
|
|
'OasisAkari',
|
|
|
|
|
'Lakejason0',
|
|
|
|
|
'wyapx',
|
|
|
|
|
'XxLittleCxX',
|
|
|
|
|
'lakejason0'
|
|
|
|
|
]
|
|
|
|
|
if whitelist_check in whitelist:
|
|
|
|
|
return False
|
2021-05-22 17:05:52 +00:00
|
|
|
|
check = await dirty.check(text)
|
2021-02-19 07:56:47 +00:00
|
|
|
|
print(check)
|
|
|
|
|
if check.find('<吃掉了>') != -1 or check.find('<全部吃掉了>') != -1:
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
2021-02-19 12:20:00 +00:00
|
|
|
|
|
2021-02-19 08:08:48 +00:00
|
|
|
|
async def query(url: str, fmt: str):
|
2021-02-19 07:56:47 +00:00
|
|
|
|
async with aiohttp.ClientSession() as session:
|
|
|
|
|
try:
|
|
|
|
|
async with session.get(url, timeout=aiohttp.ClientTimeout(total=20)) as req:
|
2021-02-19 08:08:48 +00:00
|
|
|
|
if hasattr(req, fmt):
|
|
|
|
|
return await getattr(req, fmt)()
|
2021-02-19 07:56:47 +00:00
|
|
|
|
else:
|
2021-02-19 08:08:48 +00:00
|
|
|
|
raise ValueError(f"NoSuchMethod: {fmt}")
|
2021-02-19 07:56:47 +00:00
|
|
|
|
except Exception:
|
|
|
|
|
traceback.print_exc()
|
|
|
|
|
return False
|
|
|
|
|
|
2021-02-19 12:20:00 +00:00
|
|
|
|
|
2021-02-19 07:56:47 +00:00
|
|
|
|
async def repo(kwargs: dict, cmd: list):
|
2021-02-19 12:05:58 +00:00
|
|
|
|
try:
|
2021-04-03 13:05:41 +00:00
|
|
|
|
try:
|
|
|
|
|
obj = cmd[1].replace('@', '')
|
|
|
|
|
except IndexError:
|
|
|
|
|
obj = cmd[0].replace('@', '')
|
2021-02-19 12:05:58 +00:00
|
|
|
|
result = await query('https://api.github.com/repos/' + obj, 'json')
|
2021-04-17 14:23:28 +00:00
|
|
|
|
if 'message' in result and result['message'] == 'Not Found':
|
|
|
|
|
raise RuntimeError('此仓库不存在。')
|
|
|
|
|
elif 'message' in result and result['message']:
|
|
|
|
|
raise RuntimeError(result['message'])
|
2021-02-19 12:05:58 +00:00
|
|
|
|
name = result['full_name']
|
|
|
|
|
url = result['html_url']
|
|
|
|
|
rid = result['id']
|
|
|
|
|
lang = result['language']
|
|
|
|
|
fork = result['forks_count']
|
|
|
|
|
star = result['stargazers_count']
|
|
|
|
|
watch = result['watchers_count']
|
|
|
|
|
mirror = result['mirror_url']
|
|
|
|
|
rlicense = 'Unknown'
|
2021-04-17 14:23:28 +00:00
|
|
|
|
if 'license' in result and result['license'] is not None:
|
2021-02-19 12:05:58 +00:00
|
|
|
|
if 'spdx_id' in result['license']:
|
|
|
|
|
rlicense = result['license']['spdx_id']
|
|
|
|
|
is_fork = result['fork']
|
|
|
|
|
created = result['created_at']
|
|
|
|
|
updated = result['updated_at']
|
|
|
|
|
parent = False
|
2021-02-20 10:49:23 +00:00
|
|
|
|
website = result['homepage']
|
|
|
|
|
|
|
|
|
|
if website is not None:
|
|
|
|
|
website = 'Website: ' + website + '\n'
|
|
|
|
|
else:
|
|
|
|
|
website = False
|
2021-02-19 12:05:58 +00:00
|
|
|
|
|
|
|
|
|
if mirror is not None:
|
|
|
|
|
mirror = f' (This is a mirror of {mirror} )'
|
|
|
|
|
else:
|
|
|
|
|
mirror = False
|
|
|
|
|
|
|
|
|
|
if is_fork:
|
|
|
|
|
parent_name = result['parent']['name']
|
2021-02-20 10:49:23 +00:00
|
|
|
|
parent = f' (This is a fork of {parent_name} )'
|
|
|
|
|
|
|
|
|
|
desc = result['description']
|
|
|
|
|
if desc is None:
|
|
|
|
|
desc = ''
|
|
|
|
|
else:
|
2021-03-06 01:43:58 +00:00
|
|
|
|
desc = '\n' + result['description']
|
2021-02-19 12:05:58 +00:00
|
|
|
|
|
2021-02-20 10:49:23 +00:00
|
|
|
|
msg = f'''{name} ({rid}){desc}
|
2021-02-19 07:56:47 +00:00
|
|
|
|
|
|
|
|
|
Language · {lang} | Fork · {fork} | Star · {star} | Watch · {watch}
|
2021-02-19 08:08:48 +00:00
|
|
|
|
License: {rlicense}
|
2021-02-19 07:56:47 +00:00
|
|
|
|
Created {time_diff(created)} ago | Updated {time_diff(updated)} ago
|
|
|
|
|
|
2021-02-20 10:49:23 +00:00
|
|
|
|
{website}{url}
|
|
|
|
|
'''
|
2021-02-19 07:56:47 +00:00
|
|
|
|
|
2021-02-19 12:05:58 +00:00
|
|
|
|
if mirror:
|
|
|
|
|
msg += '\n' + mirror
|
2021-02-19 11:44:28 +00:00
|
|
|
|
|
2021-02-19 12:05:58 +00:00
|
|
|
|
if parent:
|
|
|
|
|
msg += '\n' + parent
|
2021-02-19 11:44:28 +00:00
|
|
|
|
|
2021-04-03 13:37:25 +00:00
|
|
|
|
is_dirty = await dirty_check(msg, result['owner']['login'])
|
2021-02-19 12:05:58 +00:00
|
|
|
|
if is_dirty:
|
|
|
|
|
msg = 'https://wdf.ink/6OUp'
|
2021-06-05 02:00:20 +00:00
|
|
|
|
await sendMessage(kwargs, MessageChain.create([Plain(msg)]))
|
|
|
|
|
else:
|
|
|
|
|
await sendMessage(kwargs, MessageChain.create([Plain(msg), Image.fromNetworkAddress('https://opengraph.githubassets.com/c9f4179f4d560950b2355c82aa2b7750bffd945744f9b8ea3f93cc24779745a0/' + name)]))
|
2021-02-19 12:05:58 +00:00
|
|
|
|
except Exception as e:
|
|
|
|
|
await sendMessage(kwargs, '发生错误:' + str(e))
|
2021-04-17 14:23:28 +00:00
|
|
|
|
traceback.print_exc()
|
2021-02-19 07:56:47 +00:00
|
|
|
|
|
2021-02-19 12:20:00 +00:00
|
|
|
|
|
2021-02-19 07:56:47 +00:00
|
|
|
|
async def user(kwargs: dict, cmd: list):
|
2021-02-19 12:05:58 +00:00
|
|
|
|
try:
|
|
|
|
|
obj = cmd[1]
|
|
|
|
|
result = await query('https://api.github.com/users/' + obj, 'json')
|
|
|
|
|
login = result['login']
|
|
|
|
|
name = result['name']
|
|
|
|
|
uid = result['id']
|
|
|
|
|
url = result['html_url']
|
|
|
|
|
utype = result['type']
|
|
|
|
|
if 'company' in result:
|
|
|
|
|
company = result['company']
|
|
|
|
|
else:
|
|
|
|
|
company = False
|
|
|
|
|
following = result['following']
|
|
|
|
|
follower = result['followers']
|
|
|
|
|
repo = result['public_repos']
|
|
|
|
|
gist = result['public_gists']
|
|
|
|
|
is_staff = False
|
|
|
|
|
if 'license' in result:
|
|
|
|
|
if 'spdx_id' in result['license']:
|
|
|
|
|
is_staff = result['license']['spdx_id']
|
|
|
|
|
if 'twitter_username' in result:
|
|
|
|
|
twitter = result['twitter_username']
|
|
|
|
|
else:
|
|
|
|
|
twitter = False
|
|
|
|
|
created = result['created_at']
|
|
|
|
|
updated = result['updated_at']
|
|
|
|
|
if 'blog' in result:
|
|
|
|
|
website = result['blog']
|
|
|
|
|
else:
|
|
|
|
|
website = False
|
|
|
|
|
if 'location' in result:
|
|
|
|
|
location = result['location']
|
|
|
|
|
else:
|
|
|
|
|
location = False
|
|
|
|
|
hireable = False
|
|
|
|
|
if 'hireable' in result:
|
|
|
|
|
hireable = result['hireable']
|
|
|
|
|
optional = []
|
|
|
|
|
if hireable:
|
|
|
|
|
optional.append('Hireable')
|
|
|
|
|
if is_staff:
|
|
|
|
|
optional.append('GitHub Staff')
|
|
|
|
|
if company:
|
|
|
|
|
optional.append('Work · ' + company)
|
|
|
|
|
if twitter:
|
|
|
|
|
optional.append('Twitter · ' + twitter)
|
|
|
|
|
if website:
|
|
|
|
|
optional.append('Site · ' + website)
|
|
|
|
|
if location:
|
|
|
|
|
optional.append('Location · ' + location)
|
2021-02-20 10:49:23 +00:00
|
|
|
|
|
|
|
|
|
bio = result['bio']
|
2021-02-19 12:05:58 +00:00
|
|
|
|
if bio is None:
|
|
|
|
|
bio = ''
|
2021-02-20 10:49:23 +00:00
|
|
|
|
else:
|
|
|
|
|
bio = '\n' + result['bio']
|
2021-02-19 12:05:58 +00:00
|
|
|
|
|
|
|
|
|
optional_text = '\n' + ' | '.join(optional)
|
2021-02-20 10:49:23 +00:00
|
|
|
|
msg = f'''{login} aka {name} ({uid}){bio}
|
2021-02-19 12:05:58 +00:00
|
|
|
|
|
2021-02-19 08:08:48 +00:00
|
|
|
|
Type · {utype} | Follower · {follower} | Following · {following} | Repo · {repo} | Gist · {gist}{optional_text}
|
2021-02-19 07:56:47 +00:00
|
|
|
|
Account Created {time_diff(created)} ago | Latest activity {time_diff(updated)} ago
|
2021-02-19 12:05:58 +00:00
|
|
|
|
|
2021-02-19 07:56:47 +00:00
|
|
|
|
{url}
|
|
|
|
|
'''
|
|
|
|
|
|
2021-04-03 13:37:25 +00:00
|
|
|
|
is_dirty = await dirty_check(msg, login)
|
2021-02-19 12:05:58 +00:00
|
|
|
|
if is_dirty:
|
|
|
|
|
msg = 'https://wdf.ink/6OUp'
|
2021-02-19 07:56:47 +00:00
|
|
|
|
|
2021-02-19 12:05:58 +00:00
|
|
|
|
await sendMessage(kwargs, MessageChain.create([Plain(msg)]))
|
2021-03-06 02:37:10 +00:00
|
|
|
|
except Exception as error:
|
|
|
|
|
await sendMessage(kwargs, '发生错误:' + str(error))
|
2021-05-22 17:05:52 +00:00
|
|
|
|
traceback.print_exc()
|
2021-02-19 07:56:47 +00:00
|
|
|
|
|
2021-04-03 13:59:06 +00:00
|
|
|
|
|
2021-04-03 12:47:09 +00:00
|
|
|
|
async def search(kwargs: dict, cmd: list):
|
|
|
|
|
try:
|
|
|
|
|
obj = cmd[1]
|
|
|
|
|
result = await query('https://api.github.com/search/repositories?q=' + obj, 'json')
|
|
|
|
|
items = result['items']
|
|
|
|
|
item_count_expected = int(result['total_count']) if result['total_count'] < 5 else 5
|
|
|
|
|
items_out = []
|
|
|
|
|
for item in items:
|
|
|
|
|
try:
|
|
|
|
|
items_out.append(str(item['full_name'] + ': ' + item['html_url']))
|
|
|
|
|
except TypeError:
|
|
|
|
|
continue
|
|
|
|
|
footnotes = f"另有 {result['total_count'] - 5} 个结果未显示。" if item_count_expected == 5 else ''
|
|
|
|
|
msg = f"搜索成功:共 {result['total_count']} 个结果。\n" + '\n'.join(items_out[0:item_count_expected]) + f'\n{footnotes}'
|
|
|
|
|
|
|
|
|
|
is_dirty = await dirty_check(msg)
|
|
|
|
|
if is_dirty:
|
|
|
|
|
msg = 'https://wdf.ink/6OUp'
|
|
|
|
|
|
|
|
|
|
await sendMessage(kwargs, MessageChain.create([Plain(msg)]))
|
|
|
|
|
except Exception as error:
|
|
|
|
|
await sendMessage(kwargs, '发生错误:' + str(error))
|
2021-05-22 17:05:52 +00:00
|
|
|
|
traceback.print_exc()
|
2021-02-19 12:20:00 +00:00
|
|
|
|
|
2021-02-19 07:56:47 +00:00
|
|
|
|
async def forker(kwargs: dict):
|
|
|
|
|
cmd = kwargs['trigger_msg']
|
2021-02-19 11:44:28 +00:00
|
|
|
|
cmd = re.sub(r'^github ', '', cmd).split(' ')
|
2021-04-03 12:47:09 +00:00
|
|
|
|
if cmd[0] == 'repo' or '/' in cmd[0]:
|
2021-02-19 11:44:28 +00:00
|
|
|
|
return await repo(kwargs, cmd)
|
|
|
|
|
elif cmd[0] in ['user', 'usr', 'organization', 'org']:
|
2021-02-19 10:13:31 +00:00
|
|
|
|
return await user(kwargs, cmd)
|
2021-04-03 12:47:09 +00:00
|
|
|
|
elif cmd[0] == 'search':
|
|
|
|
|
return await search(kwargs, cmd)
|
2021-03-06 01:52:36 +00:00
|
|
|
|
else:
|
|
|
|
|
return await sendMessage(kwargs, '发生错误:指令使用错误,请选择 repo 或 user 工作模式。使用 ~help github 查看详细帮助。')
|
2021-02-19 07:56:47 +00:00
|
|
|
|
|
2021-02-19 12:20:00 +00:00
|
|
|
|
|
2021-02-19 07:56:47 +00:00
|
|
|
|
command = {'github': forker}
|
2021-04-08 15:20:14 +00:00
|
|
|
|
help = {'github': {'module': '查询 Github 的指定 repo(仓库)或用户详情或进行搜索。', 'help': '''~github repo <user>/<name> - 获取 GitHub 仓库信息。
|
2021-04-03 12:47:09 +00:00
|
|
|
|
~github <user|usr|organization|org> - 获取 GitHub 用户或组织信息。
|
|
|
|
|
~github search - 搜索 GitHub 上的仓库。'''}}
|