| package main |
| |
| import ( |
| "crypto/tls" |
| "github.com/mattn/go-gtk/gtk" |
| "github.com/mattn/go-xmpp" |
| "log" |
| "os" |
| "strings" |
| ) |
| |
| func main() { |
| gtk.Init(&os.Args) |
| |
| window := gtk.NewWindow(gtk.WINDOW_TOPLEVEL) |
| window.SetTitle("GoTalk") |
| window.Connect("destroy", func() { |
| gtk.MainQuit() |
| }) |
| vbox := gtk.NewVBox(false, 1) |
| scrolledwin := gtk.NewScrolledWindow(nil, nil) |
| textview := gtk.NewTextView() |
| textview.SetEditable(false) |
| textview.SetCursorVisible(false) |
| scrolledwin.Add(textview) |
| vbox.Add(scrolledwin) |
| |
| buffer := textview.GetBuffer() |
| |
| entry := gtk.NewEntry() |
| vbox.PackEnd(entry, false, false, 0) |
| |
| window.Add(vbox) |
| window.SetSizeRequest(300, 400) |
| window.ShowAll() |
| |
| dialog := gtk.NewDialog() |
| dialog.SetTitle(window.GetTitle()) |
| sgroup := gtk.NewSizeGroup(gtk.SIZE_GROUP_HORIZONTAL) |
| |
| hbox := gtk.NewHBox(false, 1) |
| dialog.GetVBox().Add(hbox) |
| label := gtk.NewLabel("username:") |
| sgroup.AddWidget(label) |
| hbox.Add(label) |
| username := gtk.NewEntry() |
| hbox.Add(username) |
| |
| hbox = gtk.NewHBox(false, 1) |
| dialog.GetVBox().Add(hbox) |
| label = gtk.NewLabel("password:") |
| sgroup.AddWidget(label) |
| hbox.Add(label) |
| password := gtk.NewEntry() |
| password.SetVisibility(false) |
| hbox.Add(password) |
| |
| dialog.AddButton(gtk.STOCK_OK, gtk.RESPONSE_OK) |
| dialog.AddButton(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) |
| dialog.SetDefaultResponse(gtk.RESPONSE_OK) |
| dialog.SetTransientFor(window) |
| dialog.ShowAll() |
| res := dialog.Run() |
| username_ := username.GetText() |
| password_ := password.GetText() |
| dialog.Destroy() |
| if res != gtk.RESPONSE_OK { |
| os.Exit(0) |
| } |
| |
| xmpp.DefaultConfig = tls.Config{ |
| ServerName: "talk.google.com", |
| InsecureSkipVerify: false, |
| } |
| |
| talk, err := xmpp.NewClient("talk.google.com:443", username_, password_, false) |
| if err != nil { |
| log.Fatal(err) |
| } |
| |
| entry.Connect("activate", func() { |
| text := entry.GetText() |
| tokens := strings.SplitN(text, " ", 2) |
| if len(tokens) == 2 { |
| func() { |
| defer recover() |
| talk.Send(xmpp.Chat{Remote: tokens[0], Type: "chat", Text: tokens[1]}) |
| entry.SetText("") |
| }() |
| } |
| }) |
| |
| go func() { |
| for { |
| func() { |
| defer recover() |
| chat, err := talk.Recv() |
| if err != nil { |
| log.Fatal(err) |
| } |
| |
| var iter gtk.TextIter |
| buffer.GetStartIter(&iter) |
| if msg, ok := chat.(xmpp.Chat); ok { |
| buffer.Insert(&iter, msg.Remote+": "+msg.Text+"\n") |
| } |
| }() |
| } |
| }() |
| |
| gtk.Main() |
| } |