Files
WinDog/LibWinDog/Platforms/NodeBB/NodeBB.py

58 lines
1.9 KiB
Python

# ==================================== #
# WinDog multi-purpose chatbot #
# Licensed under AGPLv3 by OctoSpacc #
# ==================================== #
""" # windog config start #
# NodeBBUrl = "https://nodebb.example.com"
# NodeBBToken = "abcdefgh-abcd-efgh-ijkl-mnopqrstuvwx"
# end windog config # """
import polling
NodeBBUrl = NodeBBToken = None
NodeBBStamps = {}
def nodebb_request(room_id:int='', method:str="GET", body:dict=None):
return json.loads(HttpReq(f"{NodeBBUrl}/api/v3/chats/{room_id}", method, headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {NodeBBToken}",
}, body=(body and json.dumps(body).encode())).read().decode())
def NodeBBMain(path:str) -> bool:
def handler():
try:
for room in nodebb_request()["response"]["rooms"]:
room_id = room["roomId"]
if "roomId" not in NodeBBStamps:
NodeBBStamps[room_id] = 0
if room["teaser"]["timestamp"] > NodeBBStamps[room_id]:
message = nodebb_request(room_id)["response"]["messages"][-1]
NodeBBStamps[room_id] = message["timestamp"]
if not message["self"]:
text_plain = BeautifulSoup(message["content"]).get_text()
data = InputMessageData(
# id = message["timestamp"],
text_html = message["content"],
text_plain = text_plain,
room = SafeNamespace(
id = room_id,
),
user = UserData(
settings = UserSettingsData(),
),
command = TextCommandData(text_plain, "nodebb"),
)
on_input_message_parsed(data)
call_endpoint(EventContext(platform="nodebb"), data)
except Exception:
app_log()
Thread(target=lambda:polling.poll(handler, step=3, poll_forever=True)).start()
return True
def NodeBBSender(context:EventContext, data:OutputMessageData):
nodebb_request(context.data.room.id, "POST", {"message": data["text_plain"]})
register_platform(name="NodeBB", main=NodeBBMain, sender=NodeBBSender)