Skip to content

Commit

Permalink
fix
Browse files Browse the repository at this point in the history
  • Loading branch information
HibiKier committed Aug 4, 2021
1 parent b62399e commit 910af43
Show file tree
Hide file tree
Showing 22 changed files with 571 additions and 700 deletions.
3 changes: 2 additions & 1 deletion plugins/admin_bot_manage/timing_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from .data_source import update_member_info
from services.log import logger
from models.group_info import GroupInfo
from asyncpg.exceptions import ConnectionDoesNotExistError


# 自动更新群员信息
Expand Down Expand Up @@ -37,5 +38,5 @@ async def _():
if g not in all_group:
await update_member_info(g)
logger.info(f"快速更新群信息以及权限:{g}")
except IndexError:
except (IndexError, ConnectionDoesNotExistError):
pass
2 changes: 1 addition & 1 deletion plugins/ai/data_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ def no_result() -> str:
random.choice(
[
"你在说啥子?",
f"纯洁的{list(get_bot().config.nickname)[0]}没听懂",
f"纯洁的小真寻没听懂",
"下次再告诉你(下次一定)",
"你觉得我听懂了吗?嗯?",
"我!不!知!道!",
Expand Down
73 changes: 46 additions & 27 deletions plugins/auto_invite/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,42 @@
from datetime import datetime
from configs.config import AUTO_ADD_FRIEND
from nonebot.adapters.cqhttp.exception import ActionFailed
from utils.utils import scheduler

__plugin_name__ = "好友群聊处理请求 [Hidden]"

friend_req = on_request(priority=5)


exists_list = []


@friend_req.handle()
async def _(bot: Bot, event: FriendRequestEvent, state: dict):
user = await bot.get_stranger_info(user_id=event.user_id)
nickname = user["nickname"]
await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]),
message=f"*****一份好友申请*****\n"
f"昵称:{nickname}({event.user_id})\n"
f"自动同意:{'√' if AUTO_ADD_FRIEND else '×'}\n"
f"日期:{str(datetime.now()).split('.')[0]}\n"
f"备注:{event.comment}",
)
if AUTO_ADD_FRIEND:
await bot.set_friend_add_request(flag=event.flag, approve=True)
await FriendUser.add_friend_info(user["user_id"], user["nickname"])
global exists_list
if f"{event.user_id}" not in exists_list:
exists_list.append(f"{event.user_id}")
user = await bot.get_stranger_info(user_id=event.user_id)
nickname = user["nickname"]
await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]),
message=f"*****一份好友申请*****\n"
f"昵称:{nickname}({event.user_id})\n"
f"自动同意:{'√' if AUTO_ADD_FRIEND else '×'}\n"
f"日期:{str(datetime.now()).split('.')[0]}\n"
f"备注:{event.comment}",
)
if AUTO_ADD_FRIEND:
await bot.set_friend_add_request(flag=event.flag, approve=True)
await FriendUser.add_friend_info(user["user_id"], user["nickname"])


group_req = on_request(priority=5, block=True)


@group_req.handle()
async def _(bot: Bot, event: GroupRequestEvent, state: dict):
global exists_list
if event.sub_type == "invite":
if str(event.user_id) in bot.config.superusers:
try:
Expand All @@ -41,17 +49,28 @@ async def _(bot: Bot, event: GroupRequestEvent, state: dict):
except ActionFailed:
pass
else:
nickname = await FriendUser.get_user_name(event.user_id)
await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]),
message=f"*****一份入群申请*****\n"
f"申请人:{nickname}({event.user_id})\n"
f"群聊:{event.group_id}\n"
f"邀请日期:{str(datetime.now()).split('.')[0]}",
)
await bot.send_private_msg(
user_id=event.user_id,
message="想要邀请我偷偷入群嘛~已经提醒真寻的管理员大人了\n"
"请确保已经群主或群管理沟通过!\n"
"等待管理员处理吧!",
)
if f"{event.user_id}:{event.group_id}" not in exists_list:
exists_list.append(f"{event.user_id}:{event.group_id}")
nickname = await FriendUser.get_user_name(event.user_id)
await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]),
message=f"*****一份入群申请*****\n"
f"申请人:{nickname}({event.user_id})\n"
f"群聊:{event.group_id}\n"
f"邀请日期:{str(datetime.now()).split('.')[0]}",
)
await bot.send_private_msg(
user_id=event.user_id,
message="想要邀请我偷偷入群嘛~已经提醒真寻的管理员大人了\n"
"请确保已经群主或群管理沟通过!\n"
"等待管理员处理吧!",
)


@scheduler.scheduled_job(
"interval",
minutes=5,
)
async def _():
global exists_list
exists_list = []
148 changes: 108 additions & 40 deletions plugins/genshin/query_resource_points/map.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from pathlib import Path
from configs.path_config import IMAGE_PATH, TXT_PATH
from utils.image_utils import CreateImg
from typing import Tuple
from typing import Tuple, List
from math import sqrt, pow
import random

Expand All @@ -28,6 +28,7 @@ def __init__(
deviation: Tuple[int, int] = (25, 51),
padding: int = 100,
planning_route: bool = False,
ratio: float = 1,
):
"""
参数:
Expand All @@ -36,14 +37,21 @@ def __init__(
:param deviation: 坐标误差
:param padding: 截图外边距
:param planning_route: 是否规划最佳线路
:param ratio: 压缩比率
"""
self.map = CreateImg(0, 0, background=map_path)
self.resource_name = resource_name
self.center_x = center_point[0]
self.center_y = center_point[1]
self.deviation = deviation
self.padding = padding
self.padding = int(padding * ratio)
self.planning_route = planning_route
self.ratio = ratio

self.deviation = (
int(self.deviation[0] * ratio),
int(self.deviation[1] * ratio),
)

data = json.load(open(resource_label_file, "r", encoding="utf8"))
# 资源 id
Expand All @@ -67,49 +75,51 @@ def __init__(
# 资源坐标
data = json.load(open(resource_point_file, "r", encoding="utf8"))
self.resource_point = [
(
self.center_x + int(data[x]["x_pos"]),
self.center_y + int(data[x]["y_pos"]),
Resources(
int((self.center_x + data[x]["x_pos"]) * ratio),
int((self.center_y + data[x]["y_pos"]) * ratio),
)
for x in data
if x != "CENTER_POINT" and data[x]["label_id"] == self.resource_id
]
# 传送锚点坐标
self.teleport_anchor_point = [
(
self.center_x + int(data[x]["x_pos"]),
self.center_y + int(data[x]["y_pos"]),
Resources(
int((self.center_x + data[x]["x_pos"]) * ratio),
int((self.center_y + data[x]["y_pos"]) * ratio),
)
for x in data
if x != "CENTER_POINT" and data[x]["label_id"] == self.teleport_anchor_id
]
# 神像坐标
self.teleport_god_point = [
(
self.center_x + int(data[x]["x_pos"]),
self.center_y + int(data[x]["y_pos"]),
Resources(
int((self.center_x + data[x]["x_pos"]) * ratio),
int((self.center_y + data[x]["y_pos"]) * ratio),
)
for x in data
if x != "CENTER_POINT" and data[x]["label_id"] == self.teleport_god_id
]

# 将地图上生成资源图标
def generate_resource_icon_in_map(self) -> int:
x_list = [x[0] for x in self.resource_point]
y_list = [x[1] for x in self.resource_point]
x_list = [x.x for x in self.resource_point]
y_list = [x.y for x in self.resource_point]
min_width = min(x_list) - self.padding
max_width = max(x_list) + self.padding
min_height = min(y_list) - self.padding
max_height = max(y_list) + self.padding
if self.planning_route:
self._generate_best_route()
self._generate_transfer_icon((min_width, min_height, max_width, max_height))
for x, y in self.resource_point:
for res in self.resource_point:
icon = self._get_icon_image(self.resource_id)
self.map.paste(icon, (x - self.deviation[0], y - self.deviation[1]), True)
self.map.paste(
icon, (res.x - self.deviation[0], res.y - self.deviation[1]), True
)
if self.planning_route:
self._generate_best_route()
self.map.crop((min_width, min_height, max_width, max_height))
rand = random.randint(1, 10000)
self.map.save(f'{IMAGE_PATH}/temp/genshin_map_{rand}.png')
self.map.save(f"{IMAGE_PATH}/temp/genshin_map_{rand}.png")
return rand

# 资源数量
Expand All @@ -119,40 +129,98 @@ def get_resource_count(self) -> int:
# 生成传送锚点和神像
def _generate_transfer_icon(self, box: Tuple[int, int, int, int]):
min_width, min_height, max_width, max_height = box
for points in [self.teleport_anchor_point, self.teleport_god_point]:
for resources in [self.teleport_anchor_point, self.teleport_god_point]:
id_ = (
self.teleport_anchor_id
if points == self.teleport_anchor_point
if resources == self.teleport_anchor_point
else self.teleport_god_id
)
for x, y in points:
if min_width < x < max_width and min_height < y < max_height:
for res in resources:
if min_width < res.x < max_width and min_height < res.y < max_height:
icon = self._get_icon_image(id_)
self.map.paste(
icon, (x - self.deviation[0], y - self.deviation[1]), True
icon,
(res.x - self.deviation[0], res.y - self.deviation[1]),
True,
)

# 生成最优路线(说是最优其实就是直线最短)
def _generate_best_route(self):
for x, y in self.resource_point:
min_deviation = 999999
xy = None
for points in [
self.resource_point,
self.teleport_anchor_point,
self.teleport_god_point,
]:
for r_x, r_y in points:
distance = int(sqrt(pow(abs(r_x - x), 2) + pow(abs(r_y - y), 2)))
if distance < min_deviation and x != r_x and y != r_y:
min_deviation = distance
xy = (x, y, r_x, r_y)

self.map.line(xy, (255, 0, 0), width=3)
resources_route = []
# 先连上最近的资源路径
for res in self.resource_point:
# 拿到最近的资源
current_res, _ = res.get_resource_distance(
self.resource_point
+ self.teleport_anchor_point
+ self.teleport_god_point
)
self.map.line(
(current_res.x, current_res.y, res.x, res.y), (255, 0, 0), width=1
)
resources_route.append((current_res, res))
teleport_list = self.teleport_anchor_point + self.teleport_god_point
for res1, res2 in resources_route:
point_list = [x for x in resources_route if res1 in x or res2 in x]
if not list(set(point_list).intersection(set(teleport_list))):
if res1 not in teleport_list and res2 not in teleport_list:
# while True:
# tmp = [x for x in point_list]
# break
teleport1, distance1 = res1.get_resource_distance(teleport_list)
teleport2, distance2 = res2.get_resource_distance(teleport_list)
if distance1 > distance2:
self.map.line(
(teleport1.x, teleport1.y, res1.x, res1.y),
(255, 0, 0),
width=1,
)
else:
self.map.line(
(teleport2.x, teleport2.y, res2.x, res2.y),
(255, 0, 0),
width=1,
)

# self.map.line(xy, (255, 0, 0), width=3)

# 获取资源图标
def _get_icon_image(self, id_: int) -> "CreateImg":
icon = icon_path / f"{id_}.png"
if icon.exists():
return CreateImg(50, 50, background=icon)
return CreateImg(50, 50, background=f"{icon_path}/box.png")
return CreateImg(
int(50 * self.ratio), int(50 * self.ratio), background=icon
)
return CreateImg(
int(50 * self.ratio),
int(50 * self.ratio),
background=f"{icon_path}/box.png",
)

# def _get_shortest_path(self, res: 'Resources', res_2: 'Resources'):


# 资源类
class Resources:
def __init__(self, x: int, y: int):
self.x = x
self.y = y

def get_distance(self, x: int, y: int):
return int(sqrt(pow(abs(self.x - x), 2) + pow(abs(self.y - y), 2)))

# 拿到资源在该列表中的最短路径
def get_resource_distance(self, resources: List["Resources"]) -> "Resources, int":
current_res = None
min_distance = 999999
for res in resources:
distance = self.get_distance(res.x, res.y)
if distance < min_distance and res != self:
current_res = res
min_distance = distance
return current_res, min_distance





Loading

0 comments on commit 910af43

Please sign in to comment.