Created
February 26, 2021 13:14
-
-
Save JeanRibes/28b029743814cdebbcfcd5dba731ad48 to your computer and use it in GitHub Desktop.
bridge opencomputers-discord
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module mcbridge | |
go 1.16 | |
require github.com/bwmarrin/discordgo v0.23.2 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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