aboutsummaryrefslogtreecommitdiff
path: root/irc.go
diff options
context:
space:
mode:
Diffstat (limited to 'irc.go')
-rw-r--r--irc.go143
1 files changed, 143 insertions, 0 deletions
diff --git a/irc.go b/irc.go
new file mode 100644
index 0000000..14e4a12
--- /dev/null
+++ b/irc.go
@@ -0,0 +1,143 @@
+package main
+
+import (
+ "crypto/tls"
+ "fmt"
+ "math/rand"
+
+ irc "go.lindenii.runxiyu.org/lindenii-irc"
+)
+
+var (
+ ircSendBuffered chan string
+ ircSendDirectChan chan errorBack[string]
+)
+
+type errorBack[T any] struct {
+ content T
+ errorBack chan error
+}
+
+func ircBotSession() error {
+ underlyingConn, err := tls.Dial("tcp", "irc.runxiyu.org:6697", nil)
+ if err != nil {
+ return err
+ }
+ defer underlyingConn.Close()
+
+ conn := irc.NewConn(underlyingConn)
+
+ logAndWriteLn := func(s string) (n int, err error) {
+ return conn.WriteString(s + "\r\n")
+ }
+
+ suffix := ""
+ for i := 0; i < 5; i++ {
+ suffix += string(rand.Intn(26) + 97)
+ }
+
+ _, err = logAndWriteLn("NICK :powxy-" + suffix)
+ if err != nil {
+ return err
+ }
+ _, err = logAndWriteLn("USER powxy 0 * :powxy")
+ if err != nil {
+ return err
+ }
+
+ readLoopError := make(chan error)
+ writeLoopAbort := make(chan struct{})
+ go func() {
+ for {
+ select {
+ case <-writeLoopAbort:
+ return
+ default:
+ }
+
+ msg, line, err := conn.ReadMessage()
+ if err != nil {
+ readLoopError <- err
+ return
+ }
+
+ fmt.Println(line)
+
+ switch msg.Command {
+ case "001":
+ _, err = logAndWriteLn("JOIN #logs")
+ if err != nil {
+ readLoopError <- err
+ return
+ }
+ case "PING":
+ _, err = logAndWriteLn("PONG :" + msg.Args[0])
+ if err != nil {
+ readLoopError <- err
+ return
+ }
+ case "JOIN":
+ c, ok := msg.Source.(irc.Client)
+ if !ok {
+ }
+ if c.Nick != "powxy"+suffix {
+ continue
+ }
+ _, err = logAndWriteLn("PRIVMSG #logs :test")
+ if err != nil {
+ readLoopError <- err
+ return
+ }
+ default:
+ }
+ }
+ }()
+
+ for {
+ select {
+ case err = <-readLoopError:
+ return err
+ case line := <-ircSendBuffered:
+ _, err = logAndWriteLn(line)
+ if err != nil {
+ select {
+ case ircSendBuffered <- line:
+ default:
+ }
+ writeLoopAbort <- struct{}{}
+ return err
+ }
+ case lineErrorBack := <-ircSendDirectChan:
+ _, err = logAndWriteLn(lineErrorBack.content)
+ lineErrorBack.errorBack <- err
+ if err != nil {
+ writeLoopAbort <- struct{}{}
+ return err
+ }
+ }
+ }
+}
+
+func ircSendDirect(s string) error {
+ ech := make(chan error, 1)
+
+ ircSendDirectChan <- errorBack[string]{
+ content: s,
+ errorBack: ech,
+ }
+
+ return <-ech
+}
+
+func ircBotLoop() {
+ ircSendBuffered = make(chan string, 3000)
+ ircSendDirectChan = make(chan errorBack[string])
+
+ for {
+ _ = ircBotSession()
+ }
+}
+
+func init() {
+ go ircBotLoop()
+}