Skip to content

Instantly share code, notes, and snippets.

@JeanRibes
Created February 26, 2021 13:14
Show Gist options
  • Save JeanRibes/28b029743814cdebbcfcd5dba731ad48 to your computer and use it in GitHub Desktop.
Save JeanRibes/28b029743814cdebbcfcd5dba731ad48 to your computer and use it in GitHub Desktop.
bridge opencomputers-discord
local internet = require("internet")
local term=require('term')
local thread = require("thread")
local sock = internet.socket("192.168.1.5", 25530)
function readMesages(sock)
while true do
rcv = sock:read()
if #rcv ~=0 then
print(rcv)
end
os.sleep(0.1)
end
end
sock:write("814779001540182016\n")
thread.create(readMesages,sock)
while true do
sock:write(term.read())
end
--sock;setTimeout(1) -- timeout de 1s
module mcbridge
go 1.16
require github.com/bwmarrin/discordgo v0.23.2
package main
import (
"bufio"
"fmt"
"github.com/bwmarrin/discordgo"
"net"
"os"
"os/signal"
"syscall"
)
var computersConnections map[string]func(s string)
func init() {
computersConnections = map[string]func(s string){}
}
/*
Protocole: on reçoit le channelId du Computer
on répond avec OK ou FAIL
on forward les messages suivants dans Discord; et inversement
*/
func main() {
sess, err := discordgo.New("Bot " + os.Getenv("BOT_TOKEN"))
if err != nil {
fmt.Println("error creating Discord session,", err)
return
}
sess.AddHandler(messageCreate)
sess.Identify.Intents = discordgo.MakeIntent(discordgo.IntentsDirectMessages | discordgo.IntentsGuildMessages | discordgo.IntentsDirectMessageReactions | discordgo.IntentsGuildMessageReactions)
err = sess.Open()
if err != nil {
fmt.Println("error opening connection,", err)
return
} else {
fmt.Println("OCbridgeBot tourne !")
}
go ComputercraftBridge(sess)
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
<-sc
he(sess.Close())
}
func he(err error) {
if err != nil {
panic(err)
}
}
func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.ID == s.State.User.ID {
return
}
sender, ok := computersConnections[m.ChannelID]
if ok {
println("forwarding")
sender(m.Content)
} else {
println("not a computercraft message")
}
}
func computerHandler(conn net.Conn, sess *discordgo.Session) {
r := bufio.NewReadWriter(
bufio.NewReader(conn),
bufio.NewWriter(conn))
fmt.Printf("new client: %s\n", conn.RemoteAddr())
sender := func(s string) {
_, werr := r.WriteString(s)
ghe(werr)
ghe(r.Flush())
}
_mcChanId, _, rerr := r.ReadLine()
mcChanId := string(_mcChanId)
ghe(rerr)
sender("OK")
computersConnections[mcChanId] = sender
for {
txt, _, rerr := r.ReadLine()
if rerr != nil {
break
}
fmt.Printf("reçu %s de %s\n", txt, conn.RemoteAddr())
tosend := string(txt)
if len(tosend) > 1 {
_, serr := sess.ChannelMessageSend(mcChanId, tosend)
he(serr)
}
}
fmt.Printf("client %s parti\n", conn.RemoteAddr())
}
func ComputercraftBridge(sess *discordgo.Session) {
listener, lerr := net.Listen("tcp", ":25530")
he(lerr)
for {
conn, cerr := listener.Accept()
ghe(cerr)
go computerHandler(conn, sess)
}
}
func ghe(err error) {
if err != nil {
println(err.Error())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment