ouch-relay/relay.go

78 lines
1.4 KiB
Go
Raw Normal View History

2025-02-26 22:48:32 -05:00
package main
import (
"encoding/json"
"fmt"
"os"
"sync"
"git.thc420.dev/blackbeard420/irc"
)
type Network struct {
Url string `json:"url"`
Nick string `json:"nick"`
Channel string `json:"channel"`
Name string `json:"name"`
RecvOnly bool `json:"recvonly"`
2025-02-26 22:48:32 -05:00
Connection irc.Connection
}
type Config struct {
Networks []Network `json:"networks"`
}
var netmap map[string]*Network
var netmutex sync.Mutex
func main() {
buf, _ := os.ReadFile("config.json")
conf := Config{}
json.Unmarshal(buf, &conf)
netmap = make(map[string]*Network)
wg := sync.WaitGroup{}
for i, n := range conf.Networks {
fmt.Printf("%d = [%s] %s\n", i, n.Name, n.Channel)
netmap[n.Name] = &n
n.Connection = *irc.NewConnection(n.Url, n.Nick, n.Nick, nil, []string{n.Channel})
if !n.RecvOnly {
n.Connection.PrivmsgCallbackEx = handleMessage
}
2025-02-26 22:48:32 -05:00
wg.Add(1)
go runRelay(&n)
}
wg.Wait()
}
func runRelay(n *Network) {
n.Connection.Run()
}
func handleMessage(c *irc.Connection, channel, nick, msg string) {
netmutex.Lock()
defer netmutex.Unlock()
us := getByConn(c)
for _, n := range netmap {
if n.Name != us {
n.Connection.SendPrivmsg(n.Channel, fmt.Sprintf("[%s] {%s} => %s", netmap[us].Name, irc.GetNick(nick), msg))
}
}
}
func getByConn(c *irc.Connection) string {
for _, n := range netmap {
if n.Connection.Sock == c.Sock {
return n.Name
}
}
return ""
}