└── bot.go /bot.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | "os/user" 6 | "crypto/md5" 7 | "encoding/hex" 8 | "flag" 9 | "fmt" 10 | "log" 11 | "path" 12 | "regexp" 13 | "strings" 14 | "time" 15 | 16 | "github.com/nickvanw/ircx" 17 | "github.com/sorcix/irc" 18 | "github.com/luksen/maildir" 19 | ) 20 | 21 | var ( 22 | name = flag.String("name", "testgoircx", "Nick to use in IRC") 23 | server = flag.String("server", "chat.freenode.org:6667", "Host:port to connect to") 24 | channels = flag.String("chan", "#botwar", "Channels") 25 | ) 26 | 27 | func init() { 28 | flag.Parse() 29 | } 30 | 31 | func main() { 32 | bot := ircx.Classic(*server, *name) 33 | if err := bot.Connect(); err != nil { 34 | log.Panicln("Unable to dial IRC server ", err) 35 | } 36 | RegisterHandlers(bot) 37 | bot.CallbackLoop() 38 | log.Println("Exiting...") 39 | } 40 | 41 | func RegisterHandlers(bot *ircx.Bot) { 42 | bot.AddCallback(irc.RPL_WELCOME, ircx.Callback{Handler: ircx.HandlerFunc(RegisterConnect)}) 43 | bot.AddCallback(irc.PING, ircx.Callback{Handler: ircx.HandlerFunc(PingHandler)}) 44 | 45 | maildirproxy := NewMaildirproxy(*server) 46 | bot.AddCallback(irc.PRIVMSG, ircx.Callback{Handler: ircx.HandlerFunc(maildirproxy.PrivmsgHandler)}) 47 | } 48 | 49 | func RegisterConnect(s ircx.Sender, m *irc.Message) { 50 | s.Send(&irc.Message{ 51 | Command: irc.JOIN, 52 | Params: []string{*channels}, 53 | }) 54 | } 55 | 56 | func PingHandler(s ircx.Sender, m *irc.Message) { 57 | s.Send(&irc.Message{ 58 | Command: irc.PONG, 59 | Params: m.Params, 60 | Trailing: m.Trailing, 61 | }) 62 | } 63 | 64 | type Maildirproxy struct { 65 | Server string 66 | Mdir maildir.Dir 67 | } 68 | 69 | func Formatservername(name string) string { 70 | host := strings.Split(name, ":") 71 | reg, err := regexp.Compile("[^A-Za-z0-9]+") 72 | if err != nil { 73 | log.Fatal(err) 74 | } 75 | 76 | safe := reg.ReplaceAllString(host[0], "") 77 | safe = "." + strings.ToLower(strings.Trim(safe, " ")) 78 | 79 | usr, err := user.Current() 80 | if err != nil { 81 | log.Fatal(err) 82 | } 83 | 84 | full := path.Join(usr.HomeDir, safe) 85 | return full 86 | } 87 | 88 | func exists(path string) bool { 89 | _, err := os.Stat(path) 90 | if err == nil { 91 | return true 92 | } 93 | if os.IsNotExist(err) { 94 | return false 95 | } 96 | panic(err) 97 | } 98 | 99 | func NewMaildirproxy(srv string) *Maildirproxy { 100 | normname := Formatservername(srv) 101 | var d maildir.Dir = maildir.Dir(normname) 102 | 103 | if !exists(normname) { 104 | fmt.Printf("creating maildir (%s) \n", normname) 105 | err := d.Create() 106 | if err != nil { 107 | log.Fatal(err) 108 | } 109 | } 110 | 111 | m := &Maildirproxy { 112 | Server: srv, 113 | Mdir: d, 114 | } 115 | return m 116 | } 117 | 118 | func (p *Maildirproxy) PrivmsgHandler(s ircx.Sender, m *irc.Message) { 119 | 120 | msghd := "From: " + m.Prefix.Name + " <"+ m.Prefix.User + "@" + m.Prefix.Host + ">\nTo: \nSubject: " + m.Params[0] + "\nDate: " + time.Now().UTC().Format(time.RFC1123Z) 121 | data := []byte(msghd + m.Trailing) 122 | sum := md5.Sum(data) 123 | msgid := "\nMessage-ID: " + hex.EncodeToString(sum[:]) 124 | 125 | msg := msghd + msgid + "\n\n" + m.Trailing + "\n" 126 | 127 | dlv, err := p.Mdir.NewDelivery() 128 | if err != nil { 129 | log.Fatal(err) 130 | } 131 | 132 | _, err = dlv.Write([]byte(msg)) 133 | if err != nil { 134 | log.Fatal(err) 135 | } 136 | 137 | err = dlv.Close() 138 | if err != nil { 139 | log.Fatal(err) 140 | } 141 | 142 | } 143 | --------------------------------------------------------------------------------