mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-24 09:05:04 +08:00
148 lines
6.3 KiB
Python
148 lines
6.3 KiB
Python
import re
|
||
import math
|
||
from datetime import datetime, timedelta
|
||
|
||
import requests
|
||
import pytz
|
||
|
||
from command import CommandRegistry, split_arguments
|
||
from commands import core
|
||
|
||
__registry__ = cr = CommandRegistry()
|
||
|
||
|
||
@cr.register('anime_index', 'anime-index', '番剧索引', '番剧', '新番')
|
||
@split_arguments()
|
||
def anime_index(_, ctx_msg, argv=None):
|
||
now = datetime.now(pytz.timezone('Asia/Shanghai'))
|
||
year = now.year
|
||
month = now.month
|
||
if len(argv) == 2 and re.fullmatch('(?:20)?\d{2}', argv[0]) and re.fullmatch('\d{1,2}', argv[1]):
|
||
year = int(argv[0]) if len(argv[0]) > 2 else 2000 + int(argv[0])
|
||
month = int(argv[1])
|
||
elif len(argv) == 1 and re.fullmatch('\d{1,2}', argv[0]):
|
||
month = int(argv[0])
|
||
elif len(argv) == 1 and re.fullmatch('(?:20)?\d{2}-\d{1,2}', argv[0]):
|
||
year, month = [int(x) for x in argv[0].split('-')]
|
||
year = 2000 + year if year < 100 else year
|
||
elif len(argv):
|
||
core.echo('抱歉无法识别的输入的参数,下面将给出本季度的番剧~', ctx_msg)
|
||
|
||
quarter = math.ceil(month / 3)
|
||
json = requests.get('http://bangumi.bilibili.com/web_api/season/index'
|
||
'?page=1&page_size=20&version=0&is_finish=0'
|
||
'&start_year=%d&quarter=%d&tag_id=&index_type=1&index_sort=0' % (year, quarter)).json()
|
||
if json and json.get('result') and int(json['result'].get('count', 0)) > 0:
|
||
anime_list = json['result'].get('list', [])
|
||
reply = '%d年%d月番剧\n按追番人数排序,前20部如下:\n\n' % (year, 1 + (quarter - 1) * 3)
|
||
reply += '\n'.join([anime.get('title', '未知动画') + ' '
|
||
+ ('未开播' if anime.get('total_count', -1) < 0
|
||
else ('全%d话' % anime['total_count']
|
||
if anime['newest_ep_index'] == str(anime['total_count'])
|
||
else '更新至%s' % anime['newest_ep_index']
|
||
+ ('话' if anime['newest_ep_index'].isdigit() else '')))
|
||
for anime in anime_list])
|
||
|
||
reply += '\n\n更多详细资料见 bilibili 官网 ' \
|
||
'http://bangumi.bilibili.com/anime/index' \
|
||
'#p=1&v=0&area=&stat=0&y=%d&q=%d&tag=&t=1&sort=0' % (year, quarter)
|
||
else:
|
||
reply = '没有查询到%d年%d月开播的番剧……' % (year, 1 + (quarter - 1) * 3)
|
||
|
||
core.echo(reply, ctx_msg)
|
||
|
||
|
||
@cr.register('anime_timeline', 'anime-timeline', '番剧时间表', '新番时间表')
|
||
@split_arguments(maxsplit=1)
|
||
def anime_timeline(args_text, ctx_msg, internal=False, argv=None):
|
||
if len(argv) == 0:
|
||
core.echo('请指定要查询的日期或番剧名称,例如下面(主要看参数,你的命令是对的~):\n\n'
|
||
'/新番时间表 02-21\n'
|
||
'/新番时间表 0\n'
|
||
'/新番时间表 小林家的龙女仆\n'
|
||
'/新番时间表 02-21 小林家的龙女仆\n\n'
|
||
'上面第二个例子的「0」代表和今天相差的天数,0表示今天,1表示明天,-1表示昨天,以此类推\n'
|
||
'参数中间记得用用空格隔开哦~', ctx_msg, internal)
|
||
return None
|
||
|
||
json = requests.get('http://bangumi.bilibili.com/web_api/timeline_v4').json()
|
||
if not json or 'result' not in json:
|
||
return None
|
||
|
||
timeline_list = json['result'] or []
|
||
|
||
date_str = None
|
||
anime_name = None
|
||
|
||
if re.fullmatch('\d{1,2}-\d{1,2}', argv[0]):
|
||
# month-day
|
||
date_str = '%02d-%02d' % tuple(map(lambda x: int(x), argv[0].split('-')))
|
||
argv = argv[1:]
|
||
elif re.fullmatch('-?\d', argv[0]):
|
||
# timedelta (days)
|
||
delt = timedelta(days=int(argv[0]))
|
||
dt = datetime.now() + delt
|
||
date_str = dt.strftime('%m-%d')
|
||
argv = argv[1:]
|
||
|
||
if len(argv) > 1:
|
||
anime_name = args_text.strip()
|
||
elif len(argv) == 1:
|
||
anime_name = argv[0].rstrip()
|
||
|
||
if date_str:
|
||
timeline_list = list(filter(lambda item: item.get('pub_date', '').endswith(date_str), timeline_list))
|
||
if anime_name:
|
||
timeline_list = list(filter(
|
||
lambda item: anime_name.lower() in item.get('title', '').lower()
|
||
and len(anime_name) > len(item.get('title', '')) / 4,
|
||
timeline_list
|
||
))
|
||
|
||
if internal:
|
||
return timeline_list
|
||
|
||
if date_str and anime_name:
|
||
if not timeline_list:
|
||
reply = '没更新'
|
||
else:
|
||
reply = ''
|
||
for item in timeline_list:
|
||
reply += '\n' + ('更新了' if item['is_published'] else '将在%s更新' % item['ontime']) \
|
||
+ '第%s话' % item['ep_index'] if item['ep_index'].isdigit() else item['ep_index']
|
||
reply = reply.lstrip()
|
||
|
||
core.echo(reply, ctx_msg, internal)
|
||
return
|
||
|
||
if not timeline_list:
|
||
core.echo('没有找到符合条件的时间表……', ctx_msg, internal)
|
||
return
|
||
|
||
if date_str and not anime_name:
|
||
month, day = [int(x) for x in date_str.split('-')]
|
||
reply = '在%d月%d日更新的番剧有:\n\n' % (month, day)
|
||
reply += '\n'.join([item.get('title', '未知动画') + ' '
|
||
+ item.get('ontime', '未知时间') + ' '
|
||
+ ('第%s话' % item.get('ep_index')
|
||
if item.get('ep_index', '').isdigit()
|
||
else item.get('ep_index', ''))
|
||
for item in timeline_list])
|
||
core.echo(reply, ctx_msg, internal)
|
||
elif anime_name and not date_str:
|
||
anime_dict = {}
|
||
for item in timeline_list:
|
||
k = item.get('title', '未知动画')
|
||
if k not in anime_dict:
|
||
anime_dict[k] = []
|
||
anime_dict[k].append(item)
|
||
|
||
for name, items in anime_dict.items():
|
||
reply = name + '\n'
|
||
for item in items:
|
||
_, month, day = [int(x) for x in item['pub_date'].split('-')]
|
||
reply += '\n' + ('已' if item['is_published'] else '将') \
|
||
+ '在%d月%d日%s更新' % (month, day, item['ontime']) \
|
||
+ '第%s话' % item['ep_index'] if item['ep_index'].isdigit() else item['ep_index']
|
||
core.echo(reply, ctx_msg, internal)
|