2022-01-27 21:21:25 +08:00
|
|
|
|
#!/usr/bin/python
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
# 诸葛亮与八卦阵帮忙修改语法 日期:---2022年1月19日
|
|
|
|
|
# 统计:致命(三级)错误:2个---未解决;警告(二级)错误:2个;语法(一级)错误:17个
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__version__ = '0.0.1'
|
|
|
|
|
__all__ = []
|
|
|
|
|
__author__ = 'Fuckcraft <https://gitee.com/fuckcraft>'
|
|
|
|
|
|
|
|
|
|
'''
|
|
|
|
|
Fuckcraft Websocket Library (FCWSLIB)
|
|
|
|
|
A library to develop minecraft websocket server easily.
|
|
|
|
|
|
|
|
|
|
Copyright (C) 2021 Fuckcraft
|
|
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU Affero General Public License as
|
|
|
|
|
published by the Free Software Foundation, either version 3 of the
|
|
|
|
|
License, or (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU Affero General Public License for more details.
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
from main import *
|
|
|
|
|
|
|
|
|
|
# import os
|
|
|
|
|
import json
|
|
|
|
|
import uuid
|
|
|
|
|
# import logging
|
|
|
|
|
import asyncio
|
|
|
|
|
import time
|
|
|
|
|
import websockets
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 写这段代码的时候,只有我和上帝知道这段代码是干什么的。
|
|
|
|
|
# 现在只有上帝知道。
|
|
|
|
|
# ----
|
|
|
|
|
# 没毛病,我讨厌两种人:一种是要我写注释的人,一种是给我代码看但没有写注释的人。
|
|
|
|
|
|
|
|
|
|
# 此函数用于向 Minecraft 订阅请求
|
|
|
|
|
async def subscribe(websocket, event_name):
|
|
|
|
|
"""
|
|
|
|
|
参数:
|
|
|
|
|
: websocket : websocket 对象 :
|
|
|
|
|
: event_name : 需要订阅的请求 :
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
None
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
response = {
|
|
|
|
|
'body': {
|
|
|
|
|
'eventName': str(event_name) # 示例:PlayerMessage
|
|
|
|
|
},
|
|
|
|
|
'header': {
|
|
|
|
|
'requestId': str(uuid.uuid4()),
|
|
|
|
|
'messagePurpose': 'subscribe',
|
|
|
|
|
'version': 1,
|
|
|
|
|
'messageType': 'commandRequest'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 增加 json 的可读性
|
|
|
|
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
|
|
|
|
response = json.dumps(response)
|
|
|
|
|
|
|
|
|
|
await websocket.send(response)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 此函数用于向 Minecraft 消除订阅请求
|
|
|
|
|
async def unsubscribe(webscket):
|
|
|
|
|
"""
|
|
|
|
|
参数:
|
|
|
|
|
: websocket : websocket 对象 :
|
|
|
|
|
: event_name : 需要消除订阅的请求 :
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
None
|
|
|
|
|
"""
|
|
|
|
|
print(webscket)
|
|
|
|
|
|
|
|
|
|
response = {
|
|
|
|
|
"body": {
|
|
|
|
|
"eventName": str(event_name) # PlayerMessage
|
|
|
|
|
},
|
|
|
|
|
"header": {
|
|
|
|
|
"requestId": str(uuid.uuid4()),
|
|
|
|
|
"messagePurpose": "unsubscribe",
|
|
|
|
|
"version": 1,
|
|
|
|
|
"messageType": "commandRequest"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 增加 json 的可读性
|
|
|
|
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
|
|
|
|
response = json.dumps(response)
|
|
|
|
|
|
|
|
|
|
await websocket.send(response)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 此函数用于向 Minecraft 执行命令
|
|
|
|
|
async def send_command(websocket, command):
|
|
|
|
|
"""
|
|
|
|
|
参数:
|
|
|
|
|
: websocket : websocket 对象 :
|
|
|
|
|
: command : 执行的命令 :
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
None
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
response = {
|
|
|
|
|
'body': {
|
|
|
|
|
'origin': {
|
|
|
|
|
'type': 'player'
|
|
|
|
|
},
|
|
|
|
|
'commandLine': str(command),
|
|
|
|
|
'version': 1
|
|
|
|
|
},
|
|
|
|
|
'header': {
|
|
|
|
|
'requestId': str(uuid.uuid4()),
|
|
|
|
|
'messagePurpose': 'commandRequest',
|
|
|
|
|
'version': 1,
|
|
|
|
|
'messageType': 'commandRequest'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 增加 json 的可读性
|
|
|
|
|
# response = json.dumps(response, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
|
|
|
|
response = json.dumps(response)
|
|
|
|
|
|
|
|
|
|
await websocket.send(response)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 此函数用于向 Minecraft 发送消息
|
|
|
|
|
async def tellraw(websocket, message):
|
|
|
|
|
"""
|
|
|
|
|
参数:
|
|
|
|
|
: websocket : websocket 对象 :
|
|
|
|
|
: message : 发送的消息 :
|
|
|
|
|
|
|
|
|
|
返回:
|
|
|
|
|
None
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
command = {
|
|
|
|
|
'rawtext': [
|
|
|
|
|
{
|
|
|
|
|
'text': '[{}] {}'.format(time.asctime(), message)
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 增加 json 可读性
|
|
|
|
|
# command = json.dumps(command, sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False)
|
|
|
|
|
command = json.dumps(command)
|
|
|
|
|
command = 'tellraw @a {}'.format(command)
|
|
|
|
|
|
|
|
|
|
await send_command(websocket, command)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run_server(function):
|
|
|
|
|
# 修改 ip 地址和端口
|
|
|
|
|
start_server = websockets.serve(function, 'localhost', 8080)
|
|
|
|
|
asyncio.get_event_loop().run_until_complete(start_server)
|
|
|
|
|
asyncio.get_event_loop().run_forever()
|