summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--href.go36
-rw-r--r--main.go157
2 files changed, 100 insertions, 93 deletions
diff --git a/href.go b/href.go
new file mode 100644
index 0000000..9ba955f
--- /dev/null
+++ b/href.go
@@ -0,0 +1,36 @@
+package main
+
+import (
+ "net/http"
+
+ "golang.org/x/net/html"
+)
+
+func findTitle(n *html.Node) string {
+ if n.Type == html.ElementNode && n.Data == "title" {
+ if c := n.FirstChild; n != nil {
+ return c.Data
+ }
+ }
+ for c := n.FirstChild; c != nil; c = c.NextSibling {
+ if s := findTitle(c); s != "" {
+ return s
+ }
+ }
+ return ""
+}
+
+func FetchTitle(url string) (string, error) {
+ resp, err := http.Get(url)
+ if err != nil {
+ return "", err
+ }
+ defer resp.Body.Close()
+
+ doc, err := html.Parse(resp.Body)
+ if err != nil {
+ return "", err
+ }
+
+ return findTitle(doc), nil
+}
diff --git a/main.go b/main.go
index bfef975..ab058aa 100644
--- a/main.go
+++ b/main.go
@@ -5,130 +5,101 @@ import (
"flag"
"fmt"
"log"
- "strconv"
"strings"
"time"
- "dim13.org/theo"
- "github.com/thoj/go-ircevent"
+ tdr "dim13.org/theo"
+ irc "github.com/fluffle/goirc/client"
)
var (
- server = flag.String("server", "irc.rusnet.org.ru:6660", "IRC Server")
- room = flag.String("room", "#lor", "IRC Channel")
- name = flag.String("name", "theo", "Bot Name")
+ // server = flag.String("server", "irc.rusnet.org.ru:6660", "IRC Server")
+ // room = flag.String("room", "#lor", "IRC Channel")
+ server = flag.String("server", "irc.stealth.net:6668", "IRC Server")
+ room = flag.String("room", "#mbi", "IRC Channel")
+ name = flag.String("name", "MbI", "Bot Name")
)
-var (
- buffer = ring.New(10)
- cmds = make(map[string]CmdFn)
- dscr []string
- lastNews time.Time
-)
+var buffer = ring.New(10)
+
+func init() {
+ flag.Parse()
+}
-type CmdFn func(*irc.Event, []string)
+var cmds = map[string]irc.HandlerFunc{
+ "last": last,
+ "theo": theo,
+ "news": news,
+}
-func last(e *irc.Event, _ []string) {
- conn := e.Connection
- nick := e.Nick
+func last(conn *irc.Conn, line *irc.Line) {
buffer.Do(func(v interface{}) {
if v != nil {
- ev := v.(*irc.Event)
- conn.Privmsgf(nick, "%v: %v", ev.Nick, ev.Message())
+ l := v.(*irc.Line)
+ s := fmt.Sprintf("%v <%v> %v",
+ l.Time.Format(time.Kitchen),
+ l.Nick, l.Text())
+ conn.Privmsg(line.Nick, s)
}
})
}
-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 theo(conn *irc.Conn, line *irc.Line) {
+ conn.Privmsg(line.Target(), tdr.Theo())
}
-func help(e *irc.Event, _ []string) {
- for _, m := range dscr {
- e.Connection.Privmsg(*room, m)
+func news(conn *irc.Conn, line *irc.Line) {
+ n := 0
+ if line.Public() {
+ n = 3
}
-}
-
-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
- }
+ for _, s := range FetchNews(n) {
+ conn.Privmsg(line.Target(), s)
}
- 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
+func privmsg(conn *irc.Conn, line *irc.Line) {
+ log.Println(line)
- log.Println(nick, msg)
+ if line.Public() && line.Nick != conn.Me().Nick {
+ buffer.Value = line
+ buffer = buffer.Next()
+ }
- switch msg[0] {
- case '!':
- arg := strings.Fields(msg[1:])
- if cmd, ok := cmds[arg[0]]; ok {
- go cmd(e, arg[1:])
+ if f := strings.Fields(line.Text()); len(f) > 0 {
+ if c, ok := cmds[f[0]]; ok {
+ c(conn, line)
}
- default:
- if strings.Contains(msg, *name) {
- conn.Privmsg(*room, theo.Theo())
+ }
+ if strings.Contains(line.Text(), "http") {
+ s := line.Text()
+ if i := strings.Index(s, "http"); i >= 0 {
+ s = s[i:]
+ }
+ if i := strings.IndexAny(s, " ,"); i > 0 {
+ s = s[:i]
+ }
+ if t, err := FetchTitle(s); err == nil {
+ conn.Privmsg(line.Target(), "Title: "+t)
}
- buffer.Value = e
- buffer = buffer.Next()
}
}
-func init() {
- flag.Parse()
- 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")
-}
+func main() {
+ c := irc.SimpleClient(*name)
-// 001 Welcome
-// 332 Topic
-// 333 Unix Time
-// 353 Names list
-// 366 End of NAMES List
-// JOIN
-// CTCP_ACTION /me
-// PRIVMSG
+ quit := make(chan bool)
+ c.HandleFunc(irc.DISCONNECTED,
+ func(conn *irc.Conn, line *irc.Line) { quit <- true })
-func main() {
- con := irc.IRC(*name, *name)
- err := con.Connect(*server)
- if err != nil {
+ c.HandleFunc(irc.CONNECTED,
+ func(conn *irc.Conn, line *irc.Line) { conn.Join(*room) })
+
+ c.HandleFunc(irc.PRIVMSG, privmsg)
+
+ if err := c.ConnectTo(*server); 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()
+
+ <-quit
}