#!/usr/bin/python
#
# Custom twitter client... mostly for learning Python

import sys, twitter, ConfigParser, os, datetime, dateutil.tz, gtk, gtk.glade, gobject


class MyTwitter():

    """ Display Tweets, post to twitter """

    def __init__(self):
        config = ConfigParser.ConfigParser()
        config.read(os.path.expanduser("~/.mytwitter"))
        self.username = config.get('global', 'username')
        self.password = config.get('global', 'password')

        self.num_entries = int(config.get('global', 'entries'))
        if self.num_entries < 20:
            self.num_entries = 20

        self.refresh_time = int(config.get('global', 'refreshtime'))
        if self.refresh_time < 10:
            self.refresh_time = 10

        self.labels = []
        self.texts = []
        self.list = None

        # Authenticate with twitter, set up the API object
        self.api = twitter.Api(username=self.username, password=self.password)

        # Load up all the GUI stuff
        self.init_user_interface('./default.glade')
        self.init_widgets()


    def init_user_interface(self, path_to_skin):
        self.widget_tree=gtk.glade.XML(path_to_skin, "window")
        self.widget_tree.signal_autoconnect(self)


    def init_widgets(self):
        self.list_select = self.widget_tree.get_widget('list_select')
        self.tweet_box = self.widget_tree.get_widget('tweet_box')
        self.update_entry = self.widget_tree.get_widget('update_entry')
        self.update_count = self.widget_tree.get_widget('update_count')

        # Build us some labels...
        for i in range(0, self.num_entries):
            self.labels.append(gtk.Label())
            self.tweet_box.pack_start(self.labels[i])
            self.labels[i].set_alignment(0.0, 0.0)
            self.labels[i].set_selectable(True)
            self.labels[i].set_line_wrap(True)
            self.texts.append(gtk.Label())
            self.tweet_box.pack_start(self.texts[i])
            self.texts[i].set_alignment(0.0, 0.0)
            self.texts[i].set_selectable(True)
            self.texts[i].set_line_wrap(True)

        self.tweet_box.show_all()

        # Fill the ComboBox with entries
        self.list_select.append_text('@' + self.username)
        lists = self.api.GetUserLists()
        for l in lists['lists']:
            self.list_select.append_text(l.name)

        # Timer to update periodically
        self.update_window()
        gobject.timeout_add(self.refresh_time * 1000, self.update_window)


    def update_window(self):
        timezone = dateutil.tz.gettz()
        time_format = "%Y.%m.%d %H:%M:%S %Z"

        if self.list is None or self.list == 'Home':
            statuses = self.api.GetFriendsTimeline(self.username, count=self.num_entries)
        elif self.list == '@' + self.username:
            statuses = self.api.GetReplies()
        else:
            statuses = self.api.GetListStatuses(self.list)

        for i in range(0, self.num_entries):
            if i < len(statuses):
                # Update the label with the user's name and screen name
                user = statuses[i].user

                timestamp = datetime.datetime.strptime(statuses[i].created_at, "%a %b %d %H:%M:%S +0000 %Y")
                timestamp = timestamp.replace(tzinfo=dateutil.tz.gettz('UTC'))
                timestring = timestamp.astimezone(timezone).strftime(time_format)

                labeltext = user.name + " (" + user.screen_name + ") " + timestring
                self.labels[i].set_text(labeltext)

                # Display the text of the tweet
                self.texts[i].set_text(statuses[i].text)


    def update_window_callback(self, widget):
        self.update_window()


    def update_status(self):
        text = self.update_entry.get_text()
        self.update_entry.set_text("")
        self.api.PostUpdate(text)
        self.update_window()
        

    def update_status_callback(self, widget):
        self.update_status()


    def char_counter(self, widget):
        new_count = str(len(self.update_entry.get_text())) + "/140"
        self.update_count.set_label(new_count)


    def gtk_main_quit(self, widget):
        gtk.main_quit()


    def on_about(self, widget):
        print "DEBUG: help->about not yet implemented"


    def on_list_select_changed(self, widget):
        self.list = widget.get_active_text()
        self.update_window()

### end class TwitWindow


# main
my_twitter = MyTwitter()
gtk.main()