Init
This commit is contained in:
commit
9b1d8a5b3b
|
@ -0,0 +1,30 @@
|
|||
LDFLAGS=-ldflags ""
|
||||
|
||||
GOSRC = $(shell find ./extension -type f -name '*.go' -not -path "./vendor/*")
|
||||
ARMASRC = $(shell find ./addons -type f -name '*')
|
||||
|
||||
.PHONY: build clean
|
||||
|
||||
all: clean build
|
||||
|
||||
a3tg.pbo: $(ARMASRC)
|
||||
armake2 pack -v addons a3tg.pbo
|
||||
|
||||
liba3tg.so: $(GOSRC)
|
||||
cd extension && GOARCH=386 CGO_ENABLED=1 go build $(LDFLAGS) -o ../liba3tg.so -buildmode=c-shared .
|
||||
|
||||
liba3tg.dll: $(GOSRC)
|
||||
cd extension && GOOS=windows GOARCH=386 CC=i686-w64-mingw32-cc CGO_ENABLED=1 go build $(LDFLAGS) -o ../liba3tg.dll -buildmode=c-shared .
|
||||
|
||||
liba3tg_x64.dll: $(GOSRC)
|
||||
cd extension && GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-cc CGO_ENABLED=1 go build $(LDFLAGS) -o ../liba3tg_x64.dll -buildmode=c-shared .
|
||||
|
||||
build: liba3tg.so liba3tg.dll liba3tg_x64.dll a3tg.pbo
|
||||
|
||||
clean:
|
||||
-rm a3tg.pbo
|
||||
-rm ./liba3tg.so
|
||||
-rm ./liba3tg.dll
|
||||
-rm ./liba3tg_x64.dll
|
||||
-rm ./liba3tg.h
|
||||
-rm ./liba3tg_x64.h
|
|
@ -0,0 +1 @@
|
|||
x\huashui\a3tg
|
|
@ -0,0 +1,28 @@
|
|||
class CfgPatches
|
||||
{
|
||||
class a3tg
|
||||
{
|
||||
name = "Arma 3 Telegram Bridge";
|
||||
author = "jack77213";
|
||||
url = "https://arma.huashui.cf";
|
||||
|
||||
requiredVersion = 1.92;
|
||||
requiredAddons[] = {"A3_Functions_F"};
|
||||
units[] = {};
|
||||
weapons[] = {};
|
||||
};
|
||||
};
|
||||
|
||||
class CfgFunctions
|
||||
{
|
||||
class huashui
|
||||
{
|
||||
class a3tg
|
||||
{
|
||||
file = "x\huashui\a3tg";
|
||||
class a3tg { postInit=1; };
|
||||
class sendmsg {};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
|
||||
if (!isServer) exitWith {};
|
||||
|
||||
[] spawn {
|
||||
//if (!hasInterface) exitWith {};
|
||||
if (!isServer) exitWith {};
|
||||
//if (!isDedicated) exitWith {};
|
||||
|
||||
"liba3tg" callExtension ["chat", []];
|
||||
|
||||
waitUntil {time > 0};
|
||||
|
||||
addMissionEventHandler ["ExtensionCallback", {
|
||||
params ["_name", "_function", "_data"];
|
||||
if (_name isEqualTo "a3tg") then
|
||||
{
|
||||
(format ["[TG] %2: %3", _function, _data]) remoteExecCall ["systemChat", -2, true];
|
||||
};
|
||||
}];
|
||||
|
||||
huashui_a3tg_client = {
|
||||
[] spawn {
|
||||
waitUntil {time > 0};
|
||||
["cba_events_chatMessageSent", {
|
||||
params ["_message"];
|
||||
[name player, _message] remoteExecCall ["huashui_fnc_sendmsg", 2, false];
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
};
|
||||
};
|
||||
publicVariable "huashui_a3tg_client";
|
||||
remoteExecCall ["huashui_a3tg_client", -2, true];
|
||||
|
||||
};
|
|
@ -0,0 +1,4 @@
|
|||
params ["_name", "_message"];
|
||||
|
||||
"liba3tg" callExtension ["chat", [_name, _message]];
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
module gitea.hijack.moe/huashui/a3tg/extension
|
||||
|
||||
go 1.13
|
||||
|
||||
require github.com/go-telegram-bot-api/telegram-bot-api v1.0.1-0.20200729154208-fb8759e91dfc
|
|
@ -0,0 +1,4 @@
|
|||
github.com/go-telegram-bot-api/telegram-bot-api v1.0.1-0.20200729154208-fb8759e91dfc h1:4N4M0RFas9m30PaUYz+czoIqvmduqOW/xQ7rYXF3nNI=
|
||||
github.com/go-telegram-bot-api/telegram-bot-api v1.0.1-0.20200729154208-fb8759e91dfc/go.mod h1:lDm2E64X4OjFdBUA4hlN4mEvbSitvhJdKw7rsA8KHgI=
|
||||
github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM=
|
||||
github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog=
|
|
@ -0,0 +1,92 @@
|
|||
package main
|
||||
|
||||
/*
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef int(*callbackProc)(char const *name, char const *function, char const *data);
|
||||
|
||||
static inline int bridge_cb(callbackProc cb, char const *name, char const *function, char const *data) {
|
||||
return cb(name, function, data);
|
||||
}
|
||||
|
||||
#if __x86_64__
|
||||
static inline unsigned long long min(unsigned long long a, unsigned long long b) { return a < b ? a : b; }
|
||||
#else
|
||||
static inline unsigned int min(unsigned int a, unsigned int b) { return a < b ? a : b; }
|
||||
#endif
|
||||
|
||||
*/
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var cb C.callbackProc
|
||||
var name = C.CString("a3tg")
|
||||
|
||||
func sendToArma(user, msg string) error {
|
||||
C.bridge_cb(cb, name, C.CString(user), C.CString(msg))
|
||||
return nil
|
||||
}
|
||||
|
||||
// RVExtensionRegisterCallback on extension load
|
||||
//export RVExtensionRegisterCallback
|
||||
func RVExtensionRegisterCallback(cbptr unsafe.Pointer) {
|
||||
cb = C.callbackProc(cbptr)
|
||||
|
||||
botInit()
|
||||
go telegramBridge()
|
||||
|
||||
log.Println("Calling callback function ……")
|
||||
function := C.CString("registered")
|
||||
defer C.free(unsafe.Pointer(function))
|
||||
C.bridge_cb(cb, name, function, function)
|
||||
}
|
||||
|
||||
// RVExtensionVersion on extension load
|
||||
//export RVExtensionVersion
|
||||
func RVExtensionVersion(output *C.char, outputsize C.size_t) {
|
||||
version := C.CString("Version 0.1")
|
||||
defer C.free(unsafe.Pointer(version))
|
||||
var size = C.min(C.strlen(version)+1, outputsize-1)
|
||||
C.strncpy(output, version, size)
|
||||
}
|
||||
|
||||
// RVExtensionArgs STRING callExtension ARRAY
|
||||
//export RVExtensionArgs
|
||||
func RVExtensionArgs(output *C.char, outputsize C.size_t, function *C.char, argv **C.char, argc C.int) {
|
||||
var offset = unsafe.Sizeof(uintptr(0))
|
||||
var out []string
|
||||
for index := C.int(0); index < argc; index++ {
|
||||
out = append(out, C.GoString(*argv))
|
||||
argv = (**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(argv)) + offset))
|
||||
}
|
||||
|
||||
go handleArgs(C.GoString(function), argc, out)
|
||||
}
|
||||
|
||||
// RVExtension STRING callExtension STRING
|
||||
//export RVExtension
|
||||
func RVExtension(output *C.char, outputsize C.size_t, function *C.char) {
|
||||
result := C.CString(fmt.Sprintf("Hello, %s!", C.GoString(function)))
|
||||
defer C.free(unsafe.Pointer(result))
|
||||
var size = C.min(C.strlen(result)+1, outputsize-1)
|
||||
C.strncpy(output, result, size)
|
||||
}
|
||||
|
||||
func main() {}
|
||||
|
||||
func handleArgs(function string, argc C.int, argv []string) {
|
||||
if function != "chat" || argc != 2 {
|
||||
log.Println("argc", argc)
|
||||
return
|
||||
}
|
||||
|
||||
sendToTelegram(argv[0], argv[1])
|
||||
//log.Println(argc, argv[0], argv[1])
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
)
|
||||
|
||||
var bot *tgbotapi.BotAPI
|
||||
var groupID int64
|
||||
var botAPIKey string
|
||||
|
||||
func botInit() {
|
||||
var err error
|
||||
botAPIKey = os.Getenv("TELEGRAM_APIKEY")
|
||||
groupID, err = strconv.ParseInt(os.Getenv("TELEGRAM_GROUPID"), 10, 64)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
|
||||
bot, err = tgbotapi.NewBotAPI(botAPIKey)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
} else {
|
||||
log.Printf("Bot 名称: %s", bot.Self.UserName)
|
||||
}
|
||||
}
|
||||
|
||||
func telegramBridge() {
|
||||
u := tgbotapi.NewUpdate(0)
|
||||
u.Timeout = 60
|
||||
updates, err := bot.GetUpdatesChan(u)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
|
||||
for update := range updates {
|
||||
if update.Message == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
log.Printf("<%s> %s", update.Message.From.UserName, update.Message.Text)
|
||||
|
||||
if update.Message.IsCommand() {
|
||||
//handleCommands(bot, update)
|
||||
continue
|
||||
}
|
||||
|
||||
if update.Message.Chat.ID == groupID {
|
||||
sendToArma(update.Message.From.UserName, update.Message.Text)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func sendToTelegram(player, message string) {
|
||||
msgText := fmt.Sprintf("[Arma3] <%s> %s\n", player, message)
|
||||
log.Println(msgText)
|
||||
msg := tgbotapi.NewMessage(groupID, msgText)
|
||||
bot.Send(msg)
|
||||
}
|
Loading…
Reference in New Issue