將泥巴裡的聊天轉載到Telegram...

好吧,這個大陸不適用。 不過可能有台灣人。

因為mudlib裡面無法處理HTTPS request,所以做法是把訊息先轉載到Python Script再轉發出去。

先在BOT FATHER上申請Bot, 拿到API Token, 開啟頻道,抓到頻道ID (chat_id).

在channeld上:

        if(verb == "chat" || verb == "rumor" ) {
            if(me->query("id") != "Telegram Daemon") "/adm/daemons/notify_d"->do_send(msg);
        }
        // Telegram Daemon是處理Telegram->ES2的回信。 就不再轉發到TG出了。

泥巴外的Pyhton:

import time
import socket
import requests
import json
import re
import sys
import datetime

localIP     = "0.0.0.0"
localPort   = 4001
bufferSize  = 1024

onesignal_api_token = "OneSignal的PUSH API token"
telegram_api = "Telegram BOT的API Token"

ansi_escape_8bit = re.compile(
    br'(?:\x1B[@-Z\\-_]|[\x80-\x9A\x9C-\x9F]|(?:\x1B\[|\x9B)[0-?]*[ -/]*[@-~])'
)

msgs = {
   #處理特定事件Onesignal Push.  
}

#這邊處理OneSignal 的Push
def sendAlert(x):
    header = {"Content-Type": "application/json; charset=utf-8",
              "Authorization": "Basic " + onesignal_api_token}

    payload = {"app_id": "2bf22c13-7d70-4b30-82ff-f6a43d5136bb",
               "included_segments": ["Subscribed Users"],
               "contents": {"en": x}}

    req = requests.post("https://onesignal.com/api/v1/notifications", headers=header, data=json.dumps(payload))
    print(req.status_code, req.reason)

UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPServerSocket.bind((localIP, localPort))

print("ES2 Chat -> Telegram Forwader Listening on port: " + str(localPort))

while True:
    bytesAddressPair = UDPServerSocket.recvfrom(bufferSize)
    header = bytesAddressPair[0]
    header = ansi_escape_8bit.sub(b'', header)
    try:
        header = header.decode(encoding="big5")
    except:
        header = "Chinese decode error."

    if len(header) < 10:
        break
    msg = header[9:]
    header = header[0:9]
    msg = msg.replace("\n", "")
    if header != "@@ES2US@@":
        break

    msgid = msg[0:4]
    if msgid in msgs:
        sendAlert(msgs[msgid])
    else:
        request_body = {
            "chat_id" : 000000,  #這邊要自己查看chat的ID
            "text" : msg
        }
        http_headers = {'Content-Type': 'application/json'}
        url = 'https://api.telegram.org/bot{1}/sendMessage'.format(telegram_api_token)
        response = requests.post(url, headers=http_headers, data=json.dumps(request_body))
        print(str(datetime.datetime.now()) +msg.strip())
        sys.stdout.flush()

另外 /adm/daemons/notify_d:

#include <net/socket.h>
#include <ansi.h>
#define BLOCK_SIZE 1024

inherit F_DBASE;

mapping socket_info;
int our_socket;
mapping temp_map;
int number_of_users;
object wiz;
int connected;

string host = "0.0.0.0";  // 輸入python script server的IP
int port = 4001;

void TP(string arg) {
    if (!arg) arg = "no arg";
    if (!wiz) wiz = find_player("");
    if (wiz) tell_object(wiz, GRN + arg + NOR); 
}

void create()
{

    if ( !socket_info ) {
        socket_info = ([  ]);
        temp_map = ([ ]);
        number_of_users = 0;
        seteuid( ROOT_UID );
    }

    set("name", "Notification Daemon");

}

void in_read_callback( int fd, string str ) {
    if (!str) str = "";
    TP("say " + str);
}

void do_send(string msg)
{
    int sock;

    sock = socket_create(DATAGRAM, "read_callback", "close_callback");
    if (sock <= 0) {
        TP("Failed to open socket to " + host + " " + port + "\n");
        return;
    }
    msg = "@@ES2US@@" + msg;
    socket_write(sock, msg, host + " " + port);
    socket_close(sock);
}
京ICP备13031296号-4