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"` 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}) n.Connection.PrivmsgCallbackEx = handleMessage 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 "" }