summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-07-06 22:32:44 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-07-06 22:32:44 +0200
commit4db4bdb5343b184e0d905670219e9bdfbfafb726 (patch)
tree795d37eccfcca6dc4caeb29c6fffc478524edee0 /main.go
Initial import
Diffstat (limited to 'main.go')
-rw-r--r--main.go132
1 files changed, 132 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..1517f2d
--- /dev/null
+++ b/main.go
@@ -0,0 +1,132 @@
+package main
+
+import (
+ "container/ring"
+ "fmt"
+ "log"
+ "strconv"
+ "strings"
+ "time"
+
+ "dim13.org/theo"
+ "github.com/thoj/go-ircevent"
+)
+
+const (
+ server = "irc.rusnet.org.ru:6660"
+ room = "#lor"
+ name = "theo"
+)
+
+var (
+ buffer = ring.New(10)
+ cmds = make(map[string]CmdFn)
+ dscr []string
+ lastNews time.Time
+)
+
+type CmdFn func(*irc.Event, []string)
+
+func last(e *irc.Event, _ []string) {
+ conn := e.Connection
+ nick := e.Nick
+ buffer.Do(func(v interface{}) {
+ if v != nil {
+ ev := v.(*irc.Event)
+ conn.Privmsgf(nick, "%v: %v", ev.Nick, ev.Message())
+ }
+ })
+}
+
+func metar(e *irc.Event, arg []string) {
+ conn := e.Connection
+ metar, err := FetchMetar(arg[0])
+ if err != nil {
+ conn.Privmsg(room, err.Error())
+ } else {
+ conn.Privmsg(room, metar[1])
+ }
+}
+
+func help(e *irc.Event, _ []string) {
+ for _, m := range dscr {
+ e.Connection.Privmsg(room, m)
+ }
+}
+
+func news(e *irc.Event, arg []string) {
+ conn := e.Connection
+ n := 5
+ if len(arg) > 0 {
+ i, err := strconv.Atoi(arg[0])
+ if err == nil {
+ n = i
+ }
+ }
+ if time.Since(lastNews) > time.Minute {
+ for _, n := range FetchNews(n) {
+ conn.Privmsg(room, n)
+ lastNews = time.Now()
+ }
+ } else {
+ conn.Privmsg(room, e.Nick+", me just said it")
+ }
+}
+
+func register(cmd string, f func(*irc.Event, []string), help string) {
+ cmds[cmd] = f
+ h := fmt.Sprintf("!%v %v", cmd, help)
+ dscr = append(dscr, h)
+}
+
+func privmsg(e *irc.Event) {
+ conn := e.Connection
+ msg := e.Message()
+ nick := e.Nick
+
+ log.Println(nick, msg)
+
+ switch msg[0] {
+ case '!':
+ arg := strings.Fields(msg[1:])
+ if cmd, ok := cmds[arg[0]]; ok {
+ go cmd(e, arg[1:])
+ }
+ default:
+ if strings.Contains(msg, name) {
+ conn.Privmsg(room, theo.Theo())
+ }
+ buffer.Value = e
+ buffer = buffer.Next()
+ }
+}
+
+func init() {
+ register("last", last, "shows last 10 messages")
+ register("metar", metar, "<arg> shows weather report")
+ register("help", help, "shows this message")
+ register("top", news, "shows top 10 news")
+}
+
+// 001 Welcome
+// 332 Topic
+// 333 Unix Time
+// 353 Names list
+// 366 End of NAMES List
+// JOIN
+// CTCP_ACTION /me
+// PRIVMSG
+
+func main() {
+ con := irc.IRC(name, name)
+ err := con.Connect(server)
+ if err != nil {
+ log.Fatal(err)
+ }
+ con.AddCallback("001", func(e *irc.Event) {
+ e.Connection.Join(room)
+ log.Println("joined", room)
+ })
+ con.AddCallback("PRIVMSG", privmsg)
+ con.Loop()
+}