119 lines · 2.2 KB · Go
RawDownload
package main import (	"code.google.com/p/go.net/websocket"	"fmt"	"github.com/bitly/go-notify"	"github.com/kballard/goirc/irc"	"log"	"math/rand"	"net/http") type NewUrl struct {	Url string} type WebClientMessage struct {	Type    string	Message string} // a websocket connection to irctype WebClient struct {	nick string 	config  irc.Config	irc     irc.SafeConn	ircquit chan bool 	ws *websocket.Conn} func NewWebClient(ws *websocket.Conn) *WebClient {	nick := fmt.Sprintf("comicchat%5d", rand.Intn(99999))	wc := &WebClient{		config: irc.Config{			Host:     "chat.freenode.net",			Nick:     nick,			User:     "comicchat",			RealName: "Comic Chat",		},		ws: ws,	} 	wc.config.Init = func(hr irc.HandlerRegistry) {		hr.AddHandler(irc.CONNECTED, wc.loggedin)	} 	return wc} func (w *WebClient) loggedin(conn *irc.Conn, line irc.Line) {	conn.Join([]string{"#comicchat"}, nil)} func (w *WebClient) reader() {	var err error	w.irc, err = irc.Connect(w.config)	if err != nil {		w.ws.Close()	}	for {		var m WebClientMessage		err = websocket.JSON.Receive(w.ws, &m)		if err != nil {			log.Printf("%s read: %s", w.ws.RemoteAddr(), err)			break		} 		if w.irc == nil {			continue		} 		switch m.Type {		case "nick":			w.irc.Nick(m.Message)		case "privmsg":			w.irc.Privmsg("#comicchat", m.Message)		case "action":			w.irc.Action("#comicchat", m.Message)		case "connect":		}	}} func (w *WebClient) writer() {	imgurlchan := make(chan interface{})	notify.Start("newimage", imgurlchan)	defer notify.Stop("newimage", imgurlchan) loop:	for {		select {		case url := <-imgurlchan:			var m WebClientMessage			m.Type = "newimage"			m.Message = url.(string)			if err := websocket.JSON.Send(w.ws, &m); err != nil {				log.Printf("%s closed: %s", w.ws.RemoteAddr(), err)				break loop			}		}	}} func dohttp() {	http.Handle("/new", websocket.Handler(newimagehandler))	http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir("static/"))))	http.Handle("/comic/", http.StripPrefix("/comic/", http.FileServer(http.Dir("comic/"))))	if err := http.ListenAndServe(":8899", nil); err != nil {		log.Fatal("ListenAndServe:", err)	}} func newimagehandler(ws *websocket.Conn) {	wc := NewWebClient(ws)	go wc.writer()	wc.reader()}