summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-07-09 17:44:15 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-07-09 17:44:15 +0200
commit04a3c5398af8ccabafafe3e684117d6e57ffe7b2 (patch)
tree9d51c415f5d41307a03002b1480731ddd29aba52 /main.go
parent4d51712d370f60533edc9e17631e9ade56343114 (diff)
Restructure code
Diffstat (limited to 'main.go')
-rw-r--r--main.go79
1 files changed, 64 insertions, 15 deletions
diff --git a/main.go b/main.go
index e3ecd51..ad4f8a8 100644
--- a/main.go
+++ b/main.go
@@ -15,22 +15,33 @@ import (
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")
+ name = flag.String("name", "mincom", "Bots Name")
)
-var buffer = ring.New(10)
-
-func init() {
- flag.Parse()
+type Commander interface {
+ irc.Handler
+ fmt.Stringer
}
-var cmds = map[string]irc.HandlerFunc{
- "last": last,
- "theo": theo,
- "news": news,
+type (
+ Last string
+ News string
+ BSD string
+ Theo string
+ Help string
+)
+
+var (
+ commands = make(map[string]Commander)
+ buffer = ring.New(10)
+)
+
+func Register(cmd string, f Commander) {
+ commands[cmd] = f
}
-func last(conn *irc.Conn, line *irc.Line) {
+func (v Last) String() string { return string(v) }
+func (_ Last) Handle(conn *irc.Conn, line *irc.Line) {
buffer.Do(func(v interface{}) {
if v != nil {
l := v.(*irc.Line)
@@ -42,12 +53,33 @@ func last(conn *irc.Conn, line *irc.Line) {
})
}
-func theo(conn *irc.Conn, line *irc.Line) {
+func (v Theo) String() string { return string(v) }
+func (_ Theo) Handle(conn *irc.Conn, line *irc.Line) {
conn.Privmsg(line.Target(), tdr.Theo())
}
-func news(conn *irc.Conn, line *irc.Line) {
- n := FetchNews()
+func (v News) String() string { return string(v) }
+func (_ News) Handle(conn *irc.Conn, line *irc.Line) {
+ n, err := FetchNews(lor)
+ if err != nil {
+ conn.Privmsg(line.Target(), err.Error())
+ return
+ }
+ if line.Public() {
+ n = n[:3]
+ }
+ for _, s := range n {
+ conn.Privmsg(line.Target(), s)
+ }
+}
+
+func (v BSD) String() string { return string(v) }
+func (_ BSD) Handle(conn *irc.Conn, line *irc.Line) {
+ n, err := FetchNews(undeadly)
+ if err != nil {
+ conn.Privmsg(line.Target(), err.Error())
+ return
+ }
if line.Public() {
n = n[:3]
}
@@ -56,6 +88,14 @@ func news(conn *irc.Conn, line *irc.Line) {
}
}
+func (v Help) String() string { return string(v) }
+func (_ Help) Handle(conn *irc.Conn, line *irc.Line) {
+ for k, v := range commands {
+ s := fmt.Sprintf("%4s: %v", k, v)
+ conn.Privmsg(line.Target(), s)
+ }
+}
+
func privmsg(conn *irc.Conn, line *irc.Line) {
log.Println(line)
txt := line.Text()
@@ -65,8 +105,8 @@ func privmsg(conn *irc.Conn, line *irc.Line) {
}
// lookup command
if f := strings.Fields(txt); len(f) > 0 {
- if c, ok := cmds[f[0]]; ok {
- c(conn, line)
+ if c, ok := commands[f[0]]; ok {
+ c.Handle(conn, line)
}
}
// extract single link and fetch title
@@ -83,6 +123,15 @@ func privmsg(conn *irc.Conn, line *irc.Line) {
}
}
+func init() {
+ flag.Parse()
+ Register("last", Last("return last 10 messages"))
+ Register("theo", Theo("Quote Theo De Raadt"))
+ Register("news", News("Last LOR news (msg private to see all)"))
+ Register("bsd", BSD("Last Undeadly news (msg private to see all)"))
+ Register("help", Help("This help"))
+}
+
func main() {
c := irc.SimpleClient(*name)
c.EnableStateTracking()