summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/mattermost/rsc/google/googleserver
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/mattermost/rsc/google/googleserver')
-rw-r--r--vendor/github.com/mattermost/rsc/google/googleserver/chat.go80
-rw-r--r--vendor/github.com/mattermost/rsc/google/googleserver/main.go139
2 files changed, 219 insertions, 0 deletions
diff --git a/vendor/github.com/mattermost/rsc/google/googleserver/chat.go b/vendor/github.com/mattermost/rsc/google/googleserver/chat.go
new file mode 100644
index 000000000..8b064dc92
--- /dev/null
+++ b/vendor/github.com/mattermost/rsc/google/googleserver/chat.go
@@ -0,0 +1,80 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// TODO: Add ChatHangup.
+// TODO: Auto-hangup chats that are gone.
+
+package main
+
+import (
+ "fmt"
+
+ "github.com/mattermost/rsc/google"
+ "github.com/mattermost/rsc/xmpp"
+)
+
+type chatClient struct {
+ email string
+ id string
+ xmpp *xmpp.Client
+}
+
+var chatClients = map[string]*chatClient{}
+
+func (*Server) chatClient(cid *google.ChatID) (*chatClient, error) {
+ id := cid.ID
+ cc := chatClients[cid.ID]
+ if cc == nil {
+ a := google.Cfg.AccountByEmail(cid.Email)
+ if a == nil {
+ return nil, fmt.Errorf("unknown account %s", cid.Email)
+ }
+ // New client.
+ cli, err := xmpp.NewClient("talk.google.com:443", a.Email, a.Password)
+ if err != nil {
+ return nil, err
+ }
+ cc = &chatClient{email: a.Email, id: id, xmpp: cli}
+ cc.xmpp.Status(cid.Status, cid.StatusMsg)
+ chatClients[id] = cc
+ }
+ return cc, nil
+}
+
+func (srv *Server) ChatRecv(cid *google.ChatID, msg *xmpp.Chat) error {
+ cc, err := srv.chatClient(cid)
+ if err != nil {
+ return err
+ }
+ chat, err := cc.xmpp.Recv()
+ if err != nil {
+ return err
+ }
+ *msg = chat
+ return nil
+}
+
+func (srv *Server) ChatStatus(cid *google.ChatID, _ *Empty) error {
+ cc, err := srv.chatClient(cid)
+ if err != nil {
+ return err
+ }
+ return cc.xmpp.Status(cid.Status, cid.StatusMsg)
+}
+
+func (srv *Server) ChatSend(arg *google.ChatSend, _ *Empty) error {
+ cc, err := srv.chatClient(arg.ID)
+ if err != nil {
+ return err
+ }
+ return cc.xmpp.Send(arg.Msg)
+}
+
+func (srv *Server) ChatRoster(cid *google.ChatID, _ *Empty) error {
+ cc, err := srv.chatClient(cid)
+ if err != nil {
+ return err
+ }
+ return cc.xmpp.Roster()
+}
diff --git a/vendor/github.com/mattermost/rsc/google/googleserver/main.go b/vendor/github.com/mattermost/rsc/google/googleserver/main.go
new file mode 100644
index 000000000..2cd022446
--- /dev/null
+++ b/vendor/github.com/mattermost/rsc/google/googleserver/main.go
@@ -0,0 +1,139 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+ // "flag"
+ "bufio"
+ "fmt"
+ "log"
+ "net"
+ "net/rpc"
+ "os"
+ "strings"
+ "syscall"
+
+ "github.com/mattermost/rsc/google"
+ "github.com/mattermost/rsc/xmpp"
+)
+
+func main() {
+ google.ReadConfig()
+ switch os.Args[1] {
+ case "add":
+ google.Cfg.Account = append(google.Cfg.Account, &google.Account{Email: os.Args[2], Password: os.Args[3]})
+ google.WriteConfig()
+ case "serve":
+ serve()
+ case "accounts":
+ c, err := google.Dial()
+ if err != nil {
+ log.Fatal(err)
+ }
+ out, err := c.Accounts()
+ if err != nil {
+ log.Fatal(err)
+ }
+ for _, email := range out {
+ fmt.Printf("%s\n", email)
+ }
+ case "ping":
+ c, err := google.Dial()
+ if err != nil {
+ log.Fatal(err)
+ }
+ if err := c.Ping(); err != nil {
+ log.Fatal(err)
+ }
+ case "chat":
+ c, err := google.Dial()
+ if err != nil {
+ log.Fatal(err)
+ }
+ cid := &google.ChatID{ID: "1", Email: os.Args[2], Status: xmpp.Available, StatusMsg: ""}
+ go chatRecv(c, cid)
+ c.ChatRoster(cid)
+ b := bufio.NewReader(os.Stdin)
+ for {
+ line, err := b.ReadString('\n')
+ if err != nil {
+ log.Fatal(err)
+ }
+ line = line[:len(line)-1]
+ i := strings.Index(line, ": ")
+ if i < 0 {
+ log.Printf("<who>: <msg>, please")
+ continue
+ }
+ who, msg := line[:i], line[i+2:]
+ if err := c.ChatSend(cid, &xmpp.Chat{Remote: who, Type: "chat", Text: msg}); err != nil {
+ log.Fatal(err)
+ }
+ }
+ }
+}
+
+func chatRecv(c *google.Client, cid *google.ChatID) {
+ for {
+ msg, err := c.ChatRecv(cid)
+ if err != nil {
+ log.Fatal(err)
+ }
+ switch msg.Type {
+ case "roster":
+ for _, contact := range msg.Roster {
+ fmt.Printf("%v\n", contact)
+ }
+ case "presence":
+ fmt.Printf("%v\n", msg.Presence)
+ case "chat":
+ fmt.Printf("%s: %s\n", msg.Remote, msg.Text)
+ default:
+ fmt.Printf("<%s>\n", msg.Type)
+ }
+ }
+}
+
+func listen() net.Listener {
+ socket := google.Dir() + "/socket"
+ os.Remove(socket)
+ l, err := net.Listen("unix", socket)
+ if err != nil {
+ log.Fatal(err)
+ }
+ return l
+}
+
+func serve() {
+ f, err := os.OpenFile(google.Dir()+"/log", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600)
+ if err != nil {
+ log.Fatal(err)
+ }
+ log.SetOutput(f)
+ syscall.Dup2(f.Fd(), 2)
+ os.Stdout = f
+ os.Stderr = f
+ l := listen()
+ rpc.RegisterName("goog", &Server{})
+ rpc.Accept(l)
+ log.Fatal("rpc.Accept finished: server exiting")
+}
+
+type Server struct{}
+
+type Empty google.Empty
+
+func (*Server) Ping(*Empty, *Empty) error {
+ return nil
+}
+
+func (*Server) Accounts(_ *Empty, out *[]string) error {
+ var email []string
+ for _, a := range google.Cfg.Account {
+ email = append(email, a.Email)
+ }
+ *out = email
+ return nil
+}