yuuki/libs/yuuki.py

247 lines
9.2 KiB
Python
Raw Normal View History

2019-08-22 18:33:10 +08:00
#!/usr/bin/python3
# coding=UTF-8
2019-08-24 11:46:28 +08:00
import os, time, \
requests, \
json, ntpath,\
traceback
2019-08-22 18:33:10 +08:00
2019-08-24 14:48:16 +08:00
from .core.TalkService import *
2019-08-23 18:12:41 +08:00
from .connection import Yuuki_Connect
2019-08-24 14:43:16 +08:00
from .data import Yuuki_Data
2019-08-23 18:12:41 +08:00
from .i18n import Yuuki_LangSetting
2019-08-22 18:33:10 +08:00
class Yuuki:
2019-08-23 18:12:41 +08:00
def __init__(self, Seq, Yuuki_Connection, helper_LINE_ACCESS_KEYs, Lang="en", Admin=[]):
2019-08-22 18:33:10 +08:00
self.Seq = Seq
2019-08-23 18:12:41 +08:00
self.Admin = Admin
2019-08-24 14:43:16 +08:00
self.data = Yuuki_Data()
2019-08-23 18:12:41 +08:00
self.i18n = Yuuki_LangSetting(Lang)
2019-08-22 18:33:10 +08:00
self.LINE_Media_server = "https://obs.line-apps.com"
2019-08-23 18:12:41 +08:00
self.Connect = Yuuki_Connect(Yuuki_Connection)
2019-08-22 18:33:10 +08:00
2019-08-22 18:52:24 +08:00
(self.client, self.listen) = self.Connect.connect()
2019-08-22 18:33:10 +08:00
self.connectHeader = Yuuki_Connection.connectHeader
2019-08-22 18:52:24 +08:00
for access in helper_LINE_ACCESS_KEYs:
self.Connect.helperConnect(access)
2019-08-22 18:33:10 +08:00
self.MyMID = self.client.getProfile().mid
2019-08-23 18:12:41 +08:00
global _
2019-08-24 11:29:31 +08:00
_ = self.i18n._
# Basic Func
2019-08-23 18:12:41 +08:00
2019-08-24 12:21:50 +08:00
def exit(self, restart=False):
2019-08-22 18:33:10 +08:00
if restart:
2019-08-23 18:12:41 +08:00
with open(".cache.sh", "w") as c:
c.write(sys.executable + " ./main.py")
2019-08-22 18:33:10 +08:00
os.system("sh .cache.sh")
os.system("rm .cache.sh")
sys.exit(0)
else:
sys.exit(0)
2019-08-24 14:43:16 +08:00
def sybGetGroupCreator(self, group):
if group.creator == None:
contact = group.members[0]
else:
contact = group.creator
return contact
2019-08-22 18:33:10 +08:00
def readCommandLine(self, msgs):
replymsg = ""
for msg in msgs:
replymsg = replymsg + " " + msg
return replymsg
def checkInInvitationList(self, ncMessage):
if ncMessage.param3 == self.MyMID:
inList = True
elif "\x1e" in ncMessage.param3:
if self.MyMID in ncMessage.param3.split("\x1e"):
inList = True
else:
inList = False
else:
inList = False
return inList
def changeGroupUrlStatus(self, group, stat):
if stat == True:
us = False
else:
us = True
group.members, group.invitee = None, None
group.preventJoinByTicket = us
2019-08-24 11:29:31 +08:00
self.client.updateGroup(self.Seq, group)
2019-08-22 18:33:10 +08:00
def cleanMyGroupInvitations(self):
for cleanInvitations in self.client.getGroupIdsInvited():
2019-08-24 11:29:31 +08:00
self.client.acceptGroupInvitation(self.Seq, cleanInvitations)
self.client.leaveGroup(self.Seq, cleanInvitations)
2019-08-22 18:33:10 +08:00
def getContact(self, mid):
if len(mid) == len(self.MyMID) and mid[0] == "u":
try:
contactInfo = self.getContact(mid)
except:
contactInfo = False
else:
contactInfo = False
return contactInfo
def sendToWho(self, Message):
if Message.message.toType == MIDType.USER:
return Message.message.from_
elif Message.message.toType == MIDType.ROOM:
return Message.message.to
elif Message.message.toType == MIDType.GROUP:
return Message.message.to
def sendText(self, toid, msg):
2019-08-24 11:29:31 +08:00
message = Message(to=toid, text=msg)
self.client.sendMessage(self.Seq, message)
2019-08-22 18:33:10 +08:00
def sendUser(self, toid, mid):
message = Message(contentType=ContentType.CONTACT,
text='',
contentMetadata={
'mid': mid,
'displayName': 'LINE User',
},
to=toid)
2019-08-24 11:29:31 +08:00
self.client.sendMessage(self.Seq, message)
2019-08-22 18:33:10 +08:00
def sendMedia(self, toid, type, path):
if os.path.exists(path):
file_name = ntpath.basename(path)
file_size = len(open(path, 'rb').read())
message = Message(to=toid, text=None)
message.contentType = type
message.contentPreview = None
message.contentMetadata = {
'FILE_NAME': str(file_name),
'FILE_SIZE': str(file_size),
}
if type == ContentType.FILE:
media_name = file_name
else:
media_name = 'media'
message_id = self.client.sendMessage(self.Seq, message).id
files = {
'file': open(path, 'rb'),
}
params = {
'name': media_name,
'oid': message_id,
'size': file_size,
'type': ContentType._VALUES_TO_NAMES[type].lower(),
'ver': '1.0',
}
data = {
'params': json.dumps(params)
}
url = self.LINE_Media_server + '/talk/m/upload.nhn'
r = requests.post(url, headers=self.connectHeader, data=data, files=files)
if r.status_code != 201:
2019-08-24 11:29:31 +08:00
self.sendText(toid, "Error!")
# Task
2019-08-22 18:33:10 +08:00
def Poll(self):
NoWork = 0
catchedNews = []
ncMessage = Operation()
Revision = self.client.getLastOpRevision()
while True:
try:
if NoWork == 300:
Revision = self.client.getLastOpRevision()
catchedNews = self.listen.fetchOperations(Revision, 50)
if catchedNews:
NoWork = 0
for ncMessage in catchedNews:
if ncMessage.type == OpType.RECEIVE_MESSAGE:
self.Commands(ncMessage)
elif ncMessage.type == OpType.NOTIFIED_INVITE_INTO_GROUP:
2019-08-24 11:29:31 +08:00
self.JoinGroup(ncMessage)
2019-08-22 18:33:10 +08:00
if ncMessage.reqSeq != -1:
Revision = max(Revision, ncMessage.revision)
else:
NoWork = NoWork + 1
except SystemExit:
self.exit()
except EOFError:
pass
except:
err1, err2, err3 = sys.exc_info()
2019-08-24 11:46:28 +08:00
traceback.print_tb(err3)
tb_info = traceback.extract_tb(err3)
filename, line, func, text = tb_info[-1]
2019-08-24 11:53:21 +08:00
ErrorInfo = "occurred in\n{}\n\non line {}\nin statement {}".format(filename, line, text)
2019-08-22 18:33:10 +08:00
try:
if catchedNews and ncMessage:
Finded = False
for Catched in catchedNews:
if Catched.revision == ncMessage.revision:
Finded = True
if Finded:
Revision = Catched.revision
break
if not Finded:
Revision = self.client.getLastOpRevision()
2019-08-23 18:12:41 +08:00
for Root in self.Admin:
2019-08-24 11:53:21 +08:00
self.sendText(Root, "Star Yuuki BOT - Something was wrong...\nError:\n%s\n%s\n%s\n\n%s" %
2019-08-24 11:46:28 +08:00
(err1, err2, err3, ErrorInfo))
2019-08-22 18:33:10 +08:00
except:
2019-08-24 11:53:21 +08:00
print("Star Yuuki BOT - Damage!\nError:\n%s\n%s\n%s\n\n%s" % (err1, err2, err3, ErrorInfo))
2019-08-22 18:33:10 +08:00
self.exit()
2019-08-24 11:29:31 +08:00
def JoinGroup(self, ncMessage):
if self.checkInInvitationList(ncMessage):
GroupID = ncMessage.param1
2019-08-24 14:43:16 +08:00
Inviter = ncMessage.param2
2019-08-24 11:29:31 +08:00
GroupInfo = self.client.getGroup(GroupID)
2019-08-24 14:43:16 +08:00
GroupMember = [Catched.mid for Catched in GroupInfo.members]
2019-08-24 11:29:31 +08:00
if GroupInfo.members:
2019-08-24 14:43:16 +08:00
self.client.acceptGroupInvitation(self.Seq, GroupID)
if len(GroupMember) >= 100:
self.data.updateLog("JoinGroup", (self.data.getTime(), GroupInfo.name, GroupID, Inviter))
2019-08-24 14:52:27 +08:00
self.sendText(GroupID, _("Helllo^^\nMy name is Yuuki><\nNice to meet you OwO"))
self.sendText(GroupID, _("Admin of the Group\n%s") %
2019-08-24 14:43:16 +08:00
(self.sybGetGroupCreator(GroupInfo).displayName,))
else:
2019-08-24 14:52:27 +08:00
self.sendText(GroupID, _("Sorry...\nThe number of members is not satisfied (100 needed)"))
2019-08-24 14:43:16 +08:00
self.client.leaveGroup(self.Seq, GroupID)
2019-08-24 11:29:31 +08:00
2019-08-22 18:33:10 +08:00
def Main(self, ncMessage):
pass
def Commands(self, ncMessage):
if 'BOT_CHECK' in ncMessage.message.contentMetadata:
pass
elif ncMessage.message.toType == MIDType.ROOM:
2019-08-24 11:29:31 +08:00
self.client.leaveRoom(self.Seq, ncMessage.message.to)
2019-08-22 18:33:10 +08:00
elif ncMessage.message.contentType == ContentType.NONE:
if 'Yuuki/mid' == ncMessage.message.text:
2019-08-23 18:12:41 +08:00
self.sendText(self.sendToWho(ncMessage), _("LINE System UserID\n") + ncMessage.message.from_)
2019-08-22 18:33:10 +08:00
elif 'Yuuki/Speed' == ncMessage.message.text:
Time1 = time.time()
2019-08-23 18:12:41 +08:00
self.sendText(self.sendToWho(ncMessage), _("Testing..."))
2019-08-22 18:33:10 +08:00
Time2 = time.time()
2019-08-24 11:46:28 +08:00
self.sendText(self.sendToWho(ncMessage), _("Speed:\n{}s").format(Time2 - Time1,))
2019-08-24 14:52:27 +08:00
elif 'Yuuki/Quit' == ncMessage.message.text:
if ncMessage.message.toType == MIDType.GROUP:
2019-08-24 14:55:52 +08:00
self.sendText(ncMessage.message.to, _("Bye Bye"))
2019-08-24 14:58:22 +08:00
self.client.leaveGroup(self.Seq, ncMessage.message.to)
2019-08-24 14:43:16 +08:00
elif 'Yuuki/Exit' == ncMessage.message.text:
self.sendText(self.sendToWho(ncMessage), _("Exit."))
self.exit()