func main() { reply := flag.Bool("r", false, "show replies") list := flag.String("l", "", "show tweets") user := flag.String("u", "", "show user timeline") favorite := flag.String("f", "", "specify favorite ID") //search := flag.String("s", "", "search word") inreply := flag.String("i", "", "specify in-reply ID, if not specify text, it will be RT.") verbose := flag.Bool("v", false, "detail display") flag.Usage = func() { fmt.Fprint(os.Stderr, `Usage of twty: -f ID: specify favorite ID -i ID: specify in-reply ID, if not specify text, it will be RT. -l USER/LIST: show list's timeline (ex: mattn_jp/subtech) -u USER: show user's timeline -r: show replies -v: detail display `) } flag.Parse() file, config := gotter.GetConfig() token, authorized, err := gotter.GetAccessToken(config) if err != nil { log.Fatal("faild to get access token:", err) } if authorized { b, err := json.MarshalIndent(config, "", " ") if err != nil { log.Fatal("failed to store file:", err) } err = ioutil.WriteFile(file, b, 0700) if err != nil { log.Fatal("failed to store file:", err) } } if *reply { tweets, err := gotter.GetTweets(token, "https://api.twitter.com/1/statuses/mentions.json", map[string]string{}) if err != nil { log.Fatal("failed to get tweets:", err) } gotter.ShowTweets(tweets, *verbose) } else if len(*list) > 0 { part := strings.Split(*list, "/", 2) tweets, err := gotter.GetTweets(token, "https://api.twitter.com/1/"+part[0]+"/lists/"+part[1]+"/statuses.json", map[string]string{}) if err != nil { log.Fatal("failed to get tweets:", err) } gotter.ShowTweets(tweets, *verbose) } else if len(*user) > 0 { tweets, err := gotter.GetTweets(token, "https://api.twitter.com/1/statuses/user_timeline.json", map[string]string{"screen_name": *user}) if err != nil { log.Fatal("failed to get tweets:", err) } gotter.ShowTweets(tweets, *verbose) } else if len(*favorite) > 0 { gotter.PostTweet(token, "https://api.twitter.com/1/favorites/create/"+*favorite+".json", map[string]string{}) } else if flag.NArg() == 0 { if len(*inreply) > 0 { gotter.PostTweet(token, "https://api.twitter.com/1/statuses/retweet/"+*inreply+".json", map[string]string{}) } else { tweets, err := gotter.GetTweets(token, "https://api.twitter.com/1/statuses/home_timeline.json", map[string]string{}) if err != nil { log.Fatal("failed to get tweets:", err) } gotter.ShowTweets(tweets, *verbose) } } else { gotter.PostTweet(token, "https://api.twitter.com/1/statuses/update.json", map[string]string{"status": strings.Join(flag.Args(), " "), "in_reply_to_status_id": *inreply}) } }
func Gui() { //-------------------------------------------------------- // Setting up the GTK-Foo //-------------------------------------------------------- gdk.ThreadsInit() gtk.Init(&os.Args) window := gtk.Window(gtk.GTK_WINDOW_TOPLEVEL) window.SetTitle("Zwitscher!") window.Connect("destroy", func() { gtk.MainQuit() }) vbox := gtk.VBox(false, 1) notebook := gtk.Notebook() //-------------------------------------------------------- // Home View //-------------------------------------------------------- vboxHome := gtk.VBox(false, 1) scrolledWinHome := gtk.ScrolledWindow(nil, nil) //Disable hscrollbar, enable vscrollbar scrolledWinHome.SetPolicy(gtk.GTK_POLICY_NEVER, gtk.GTK_POLICY_ALWAYS) vboxHome.Add(scrolledWinHome) vboxScrolledWinHome := gtk.VBox(false, 1) scrolledWinHome.AddWithViewPort(vboxScrolledWinHome) tweetwidgets := []*gtk.GtkFrame{} buttonUpdateTimeline := gtk.ButtonWithLabel("Update Timeline") buttonUpdateTimeline.Clicked(func() { var tweet gotter.Tweet tweets, err := gotter.GetTweets(accounts.Credentials, "https://api.twitter.com/1/statuses/home_timeline.json", map[string]string{}) if err != nil { println("failed to get tweets:", err.String()) return } for i := len(tweets) - 1; i >= 0; i-- { tweet = tweets[i] id, _ := strconv.Atoi64(tweet.Identifier) if accounts.Maxreadid < id { if len(tweetwidgets) > 20 { tweetwidgets[0].Destroy() tweetwidgets = tweetwidgets[1:] } tweetwidget := TweetWidget(tweet) vboxScrolledWinHome.PackEnd(tweetwidget, false, false, 0) tweetwidget.ShowAll() tweetwidgets = append(tweetwidgets, tweetwidget) accounts.Maxreadid = id } } }) vboxHome.PackEnd(buttonUpdateTimeline, false, false, 0) notebook.AppendPage(vboxHome, gtk.Label("Home")) //-------------------------------------------------------- // Mentions View //-------------------------------------------------------- scrolledwin := gtk.ScrolledWindow(nil, nil) notebook.AppendPage(scrolledwin, gtk.Label("Mentions")) //-------------------------------------------------------- // Messages View //-------------------------------------------------------- scrolledwin = gtk.ScrolledWindow(nil, nil) notebook.AppendPage(scrolledwin, gtk.Label("Messages")) vbox.Add(notebook) //-------------------------------------------------------- // Fild for Tweets //-------------------------------------------------------- hbox := gtk.HBox(false, 1) dir, _ := filepath.Split(os.Args[0]) imagefile := filepath.Join(dir, "Awesome Smiley Original.jpg") image := gtk.ImageFromFile(imagefile) hbox.PackStart(image, false, false, 0) buttonZwitscher := gtk.ButtonWithLabel("Zwitscher!") newTweetTextField := gtk.Entry() charCounterLabel := gtk.Label("140") buttonZwitscher.SetTooltipMarkup("Tweet") buttonZwitscher.Clicked(func() { charCounterLabel.SetLabel("140") SendTweet(newTweetTextField.GetText()) newTweetTextField.SetText("") }) newTweetTextField.Connect("key-release-event", func() { length := utf8.RuneCountInString(newTweetTextField.GetText()) charCounterLabel.SetLabel((string)(strconv.Itoa(140 - length))) }) newTweetTextField.Connect("activate", func() { if newTweetTextField.GetText() != "" { //pressed enter, and text is not empty charCounterLabel.SetLabel("140") SendTweet(newTweetTextField.GetText()) newTweetTextField.SetText("") } }) hbox.PackStartDefaults(newTweetTextField) hbox.PackStart(charCounterLabel, false, false, 0) hbox.PackEnd(buttonZwitscher, false, false, 0) vbox.PackEnd(hbox, false, false, 0) //-------------------------------------------------------- // Event //-------------------------------------------------------- window.Add(vbox) window.SetSizeRequest(400, 550) window.ShowAll() gdk.ThreadsEnter() gtk.Main() gdk.ThreadsLeave() }