-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.py
144 lines (126 loc) · 4.95 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
version='1.0.0.0'
import os
import sys
root=os.getcwd()
sys.path.append("lib")
sys.path.append("svc")
sys.path.append("bin")
import asyncio
from asyncio import create_task as mktask
import importlib
import re
from random import randint
import time
import sqlite_utils
import datetime
import string
#/lib packages
from vk import API, APIu
from vk import Longpoll
from vk import newMessage
from storage import Storage
from users import User
from attachments import Attachments
from logger import Log
startTime = time.time()
me=-201340515
Storage=Storage()
Log=Log(True)
commands=[]
class Utils:
def listValToKey(dictionary: dict, value: str):
for key in dictionary:
if value in dictionary[key]:
return key
def forBot(event):
return bool(event.split(" ")[0].lower().translate(str.maketrans('', '', string.punctuation))==Storage("botName").lower())
def haveAttachments(event):
return bool(event["attachments"])
def services():
def mapping(string):
if not os.path.isdir(f"./svc/{string}"):
return string[0:-3]
return ""
svcs=list(map(mapping,os.listdir("./svc")))
svcsfr=[]
for svc in svcs:
if svc:
svcsfr.append(svc)
return svcsfr
def commands():
def mapping(string):
if not os.path.isdir(f"./bin/{string}"):
return string[0:-3]
return ""
svcs=list(map(mapping,os.listdir("./bin")))
svcsfr=[]
for svc in svcs:
if svc:
svcsfr.append(svc)
return svcsfr
async def handler(chatID:int = 0 ,messageID:int = 0, sender: int = 0,context:int = 0 ,text: str = "",attachments: list = [],stickerID:int = 0,actionType:str = "",actionUser:int = 0):
parsedMessage=await messageParser(text)
Log.debug(f"{text.split(' ')[0].lower().translate(str.maketrans('', '', string.punctuation))} {Storage('botName').lower()} {Utils.forBot(text)}")
Log.debug(f"Пришло сообщение. Имя бота: {Storage('botName')}. Текст: {text}. parsedMessage: {parsedMessage}")
if sender>0:
for service in services():
Log.debug(f"Сервис {service} обработан!")
module=importlib.import_module(service)
importlib.reload(module)
await module.main(chatID,messageID,sender,context,text,attachments,stickerID,actionType,actionUser)
for key in parsedMessage:
if (key in commands()) and (Utils.forBot(text)) and (sender in Storage("admins")):
try:
module=importlib.import_module(key)
importlib.reload(module)
await module.main(chatID,messageID,sender,context,text,attachments,stickerID,actionType,actionUser)
except Exception as e:
Log.error(f"Невозможно загрузить команду {key}. {e}")
break
async def messageParser(message: str = ""):
message=message.replace("\n"," ")
parsedMessage={}
commandList=[]
aliases=Storage("aliases")
for command in aliases:
for alias in aliases[command]:
commandList.append(alias)
for command in commandList:
if message.find(command)!=-1:
temp=message
for subcommand in commandList:
if message[message.find(command)+len(command):].find(subcommand)!=-1:
message=message[:message.find(command)+len(command)+message[message.find(command)+len(command):].find(subcommand)]
message=message[message.find(command)+len(command):].strip()
parsedMessage.update({Utils.listValToKey(aliases,command):message})
message=temp
return parsedMessage
def getContext(raw):
if raw["fwd_messages"]:
return raw["fwd_messages"][0]["from_id"]
elif raw.get("reply_message",None):
return raw["reply_message"]["from_id"]
else:
if re.search("\[[a-zA-Zа-яА-Я0-9 ]+\|[@a-zA-Zа-яА-Я0-9 ]+\]",raw["text"]):
return re.search("\[[a-zA-Zа-яА-Я0-9 ]+\|[@a-zA-Zа-яА-Я0-9 ]+\]",raw["text"])[0].split("|")[0][3:]
return 0
async def main():
Log.warn(f"{Storage('botName')} запущен!")
Storage("startTime",time.time())
for event in Longpoll.listen():
serverEvent=event
event=event.message
if serverEvent.type == newMessage and event.from_id!=me:
task=mktask(handler(
chatID=event.peer_id-2000000000,
messageID=event.conversation_message_id,
sender=event.from_id,
context=getContext(event),
text=event.text,
attachments=Attachments.attachmentsList(event["attachments"]),
stickerID=Attachments.findSticker(event["attachments"]),
actionType=event.get("action",{}).get("type",""),
actionUser=int(event.get("action",{}).get("member_id",0))
))
await task
asyncio.run(main())