2022-07-14 05:31:47 +00:00
|
|
|
|
import re
|
|
|
|
|
import urllib.parse
|
|
|
|
|
|
|
|
|
|
from bs4 import BeautifulSoup
|
|
|
|
|
|
2022-06-28 06:11:03 +00:00
|
|
|
|
from core.builtins.message import MessageSession
|
2022-07-31 08:27:58 +00:00
|
|
|
|
from core.component import on_command
|
2022-07-14 05:31:47 +00:00
|
|
|
|
from core.utils import get_url
|
2022-01-19 15:28:46 +00:00
|
|
|
|
|
|
|
|
|
mod_dl = on_command(
|
|
|
|
|
bind_prefix='mod_dl',
|
|
|
|
|
desc='下载CurseForge上的Mod。',
|
2022-07-14 05:31:47 +00:00
|
|
|
|
developers=['HornCopper', 'OasisAkari'],
|
2022-01-21 11:42:02 +00:00
|
|
|
|
recommend_modules=['mcmod'],
|
|
|
|
|
alias='moddl')
|
2022-01-19 15:28:46 +00:00
|
|
|
|
|
2022-01-21 11:40:12 +00:00
|
|
|
|
|
2022-07-14 05:31:47 +00:00
|
|
|
|
def cn_chk(string: str):
|
|
|
|
|
for word in string:
|
|
|
|
|
if u'\u4e00' <= word <= u'\u9fff':
|
|
|
|
|
return True
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
source_url = 'https://files.xmdhs.com/curseforge/'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mod_dl.handle('<mod_name> [<version>] {通过模组名获取模组下载链接,CloudFlare CDN支持。}')
|
2022-01-19 15:28:46 +00:00
|
|
|
|
async def main(msg: MessageSession):
|
2022-07-14 05:31:47 +00:00
|
|
|
|
mod_name = msg.parsed_msg['<mod_name>']
|
2022-08-15 05:32:31 +00:00
|
|
|
|
ver = msg.parsed_msg.get('<version>', False)
|
2022-07-14 05:31:47 +00:00
|
|
|
|
if ver:
|
|
|
|
|
match_ver = re.match(r'^\d+\.\d+\.\d+$|^\d+\.\d+$|\d+w\d+[abcd]', ver)
|
|
|
|
|
if match_ver is None:
|
|
|
|
|
mod_name += ' ' + ver
|
|
|
|
|
ver = False
|
|
|
|
|
if cn_chk(mod_name):
|
|
|
|
|
return {'msg': 'CurseForge暂不支持中文搜索。', 'success': False}
|
|
|
|
|
full_url = f'{source_url}s?q={urllib.parse.quote(mod_name)}&type=1'
|
|
|
|
|
try:
|
|
|
|
|
html = await get_url(full_url, status_code=200)
|
|
|
|
|
bs = BeautifulSoup(html, 'html.parser')
|
|
|
|
|
information = bs.body.div.div
|
|
|
|
|
infos = {}
|
|
|
|
|
for x in information.find_all('a'):
|
|
|
|
|
infos[x.find('h3').text] = x.get('href')
|
|
|
|
|
if len(infos) > 1:
|
|
|
|
|
reply_text = []
|
|
|
|
|
i = 0
|
|
|
|
|
for info in infos:
|
|
|
|
|
i += 1
|
|
|
|
|
reply_text.append(f'{i}. {info}')
|
|
|
|
|
reply = await msg.waitReply('搜索结果如下:\n' + '\n'.join(reply_text) + '\n请回复编号来选择mod。')
|
|
|
|
|
replied = reply.asDisplay()
|
|
|
|
|
if replied.isdigit():
|
|
|
|
|
replied = int(replied)
|
|
|
|
|
if replied > len(infos):
|
|
|
|
|
return await msg.finish('编号超出范围。')
|
|
|
|
|
else:
|
|
|
|
|
mod_url = infos[list(infos.keys())[replied - 1]]
|
|
|
|
|
else:
|
|
|
|
|
return await msg.finish('无效的编号,必须为纯数字。')
|
|
|
|
|
else:
|
|
|
|
|
mod_url = infos[list(infos.keys())[0]]
|
|
|
|
|
html_2 = await get_url(f'{source_url}{mod_url[1:]}', status_code=200)
|
|
|
|
|
bs_2 = BeautifulSoup(html_2, 'html.parser')
|
|
|
|
|
information_2 = bs_2.body.div.div
|
|
|
|
|
infos_2 = {}
|
|
|
|
|
for x in information_2.find_all('a'):
|
|
|
|
|
infos_2[x.find('h3').text] = x.get('href')
|
|
|
|
|
if ver:
|
|
|
|
|
if ver in infos_2:
|
|
|
|
|
mod_url_2 = infos_2[ver]
|
|
|
|
|
else:
|
|
|
|
|
return await msg.finish('没有找到指定版本的模组。')
|
|
|
|
|
else:
|
|
|
|
|
reply_text = []
|
|
|
|
|
for info2 in infos_2:
|
|
|
|
|
reply_text.append(f'{info2}')
|
|
|
|
|
reply2 = await msg.waitReply('此mod拥有如下版本:\n' + '\n'.join(reply_text) + '\n请回复版本号来选择版本。')
|
|
|
|
|
replied2 = reply2.asDisplay()
|
|
|
|
|
if replied2 in infos_2:
|
|
|
|
|
mod_url_2 = infos_2[replied2]
|
|
|
|
|
ver = replied2
|
|
|
|
|
else:
|
|
|
|
|
return await msg.finish('无效的版本号。')
|
|
|
|
|
url_3 = source_url + mod_url_2[1:]
|
|
|
|
|
html_3 = await get_url(url_3, status_code=200)
|
|
|
|
|
bs_3 = BeautifulSoup(html_3, 'html.parser')
|
|
|
|
|
infos = {'normal': {}, 'fabric': {}, 'forge': {}}
|
|
|
|
|
information_3 = bs_3.find_all('tr')
|
|
|
|
|
for x in information_3[1:]:
|
|
|
|
|
tbs = x.find_all('td')
|
|
|
|
|
mod = tbs[0].find('a')
|
|
|
|
|
status = tbs[1].text
|
|
|
|
|
name = mod.text
|
|
|
|
|
depends = tbs[3].find_all('a')
|
|
|
|
|
mod_type = 'normal'
|
|
|
|
|
if name.lower().find('fabric') != -1:
|
|
|
|
|
mod_type = 'fabric'
|
|
|
|
|
elif name.lower().find('forge') != -1:
|
|
|
|
|
mod_type = 'forge'
|
|
|
|
|
if status not in infos[mod_type]:
|
2022-07-31 08:33:20 +00:00
|
|
|
|
infos[mod_type][status] = {'url': mod.get('href'), 'depends': len(depends), 'name': name}
|
2022-07-14 05:31:47 +00:00
|
|
|
|
send_ = []
|
|
|
|
|
for x in infos:
|
|
|
|
|
for y in infos[x]:
|
|
|
|
|
send_.append((f'{x.title()} ({y}):\n' if x != 'normal' else f'{y}:\n') +
|
|
|
|
|
f'下载链接:{infos[x][y]["url"]}\n'
|
|
|
|
|
f'文件名:{infos[x][y]["name"]}\n' +
|
2023-01-28 05:53:11 +00:00
|
|
|
|
(f'此mod共有{str(infos[x][y]["depends"])}个依赖,请确认是否已经下载:\n{url_3}' if
|
|
|
|
|
infos[x][y][
|
|
|
|
|
"depends"] > 0 else ''))
|
2022-07-14 05:31:47 +00:00
|
|
|
|
await msg.finish('\n'.join(send_))
|
|
|
|
|
|
|
|
|
|
except ValueError: # 404 ...
|
|
|
|
|
await msg.finish('未找到该Mod。')
|