Exemplo n.º 1
0
class soundSystem(object):

 def check_soundpack(self):
  """ Checks if the folder where live the current soundpack exists."""
  self.soundpack_OK = False
  if os.path.exists(paths.sound_path(self.config["current_soundpack"])):
   self.path = paths.sound_path(self.config["current_soundpack"])
   self.soundpack_OK = True
  elif os.path.exists(paths.sound_path("default")):
   log.error("The soundpack does not exist, using default...")
   self.path = paths.sound_path("default")
   self.soundpack_OK = True
  else:
   log.error("The current soundpack could not be found and the default soundpack has been deleted, " + application.name + " will not play sounds.")
   self.soundpack_OK = False

 def __init__(self, soundConfig):
  """ Sound Player."""
  self.config = soundConfig
  # Set the output and input default devices.
  try:
   self.output = sound_lib.output.Output()
   self.input = sound_lib.input.Input()
  except:
   pass
   # Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
  try:
   log.debug("Setting input and output devices...")
   self.output.set_device(self.output.find_device_by_name(self.config["output_device"]))
   self.input.set_device(self.input.find_device_by_name(self.config["input_device"]))
  except:
   log.error("Error in input or output devices, using defaults...")
   self.config["output_device"] = "Default"
   self.config["input_device"] = "Default"

  self.files = []
  self.cleaner = RepeatingTimer(60, self.clear_list)
  self.cleaner.start()
  self.check_soundpack()

 def clear_list(self):
  log.debug("Cleaning sounds... Total sounds found: %i" % len(self.files))
  if len(self.files) == 0: return
  try:
   for i in range(0, len(self.files)):
    if self.files[i].is_playing == False:
     self.files[i].free()
     self.files.pop(i)
  except IndexError:
   pass
  log.debug("Files used now: %i" % len(self.files))

 def play(self, sound, argument=False):
  if self.soundpack_OK == False: return
  if self.config["session_mute"] == True: return
  sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound))
  sound_object.volume = float(self.config["volume"])
  self.files.append(sound_object)
  sound_object.play()
Exemplo n.º 2
0
class soundSystem(object):

 def check_soundpack(self):
  """ Checks if the folder where live the current soundpack exists."""
  self.soundpack_OK = False
  if os.path.exists(paths.sound_path(self.config["current_soundpack"])):
   self.path = paths.sound_path(self.config["current_soundpack"])
   self.soundpack_OK = True
  elif os.path.exists(paths.sound_path("default")):
   log.error("The soundpack does not exist, using default...")
   self.path = paths.sound_path("default")
   self.soundpack_OK = True
  else:
   log.error("The current soundpack could not be found and the default soundpack has been deleted, " + application.name + " will not play sounds.")
   self.soundpack_OK = False

 def __init__(self, soundConfig):
  """ Sound Player."""
  self.config = soundConfig
  # Set the output and input default devices.
  try:
   self.output = sound_lib.output.Output()
   self.input = sound_lib.input.Input()
  except:
   pass
   # Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
  try:
   log.debug("Setting input and output devices...")
   self.output.set_device(self.output.find_device_by_name(self.config["output_device"]))
   self.input.set_device(self.input.find_device_by_name(self.config["input_device"]))
  except:
   log.error("Error in input or output devices, using defaults...")
   self.config["output_device"] = "Default"
   self.config["input_device"] = "Default"

  self.files = []
  self.cleaner = RepeatingTimer(60, self.clear_list)
  self.cleaner.start()
  self.check_soundpack()

 def clear_list(self):
  log.debug("Cleaning sounds... Total sounds found: %i" % len(self.files))
  if len(self.files) == 0: return
  try:
   for i in range(0, len(self.files)):
    if self.files[i].is_playing == False:
     self.files[i].free()
     self.files.pop(i)
  except IndexError:
   pass
  log.debug("Files used now: %i" % len(self.files))

 def play(self, sound, argument=False):
  if self.soundpack_OK == False: return
  if self.config["session_mute"] == True: return
  sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound))
  sound_object.volume = float(self.config["volume"])
  self.files.append(sound_object)
  sound_object.play()
Exemplo n.º 3
0
class soundSystem(object):
    def check_soundpack(self):
        """ Checks if the folder where live the current soundpack exists."""
        self.soundpack_OK = False
        if os.path.exists(
                paths.sound_path(config.main["sound"]["current_soundpack"])):
            self.path = paths.sound_path(
                config.main["sound"]["current_soundpack"])
            self.soundpack_OK = True
        elif os.path.exists(paths.sound_path("default")):
            self.path = paths.sound_path("default")
            self.soundpack_OK = True
        else:
            self.soundpack_OK = False

    def __init__(self):
        """ Sound Player."""
        # Set the output and input default devices.
        self.output = sound_lib.output.Output()
        self.input = sound_lib.input.Input()
        # Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
        try:
            self.output.set_device(
                self.output.find_device_by_name(
                    config.main["sound"]["output_device"]))
            self.input.set_device(
                self.input.find_device_by_name(
                    config.main["sound"]["input_device"]))
        except:
            config.main["sound"]["output_device"] = "Default"
            config.main["sound"]["input_device"] = "Default"

        self.files = []
        self.cleaner = RepeatingTimer(60, self.clear_list)
        self.cleaner.start()
        self.check_soundpack()

    def clear_list(self):
        log.debug("Cleaning sounds... Total sounds found: %i" %
                  len(self.files))
        if self.files == []: return
        for i in xrange(0, len(self.files)):
            if self.files[i].is_playing == False:
                self.files[i].free()
                self.files.pop(i)
        log.debug("Files used now: %i" % len(self.files))

    def play(self, sound, argument=False):
        if self.soundpack_OK == False: return
        if config.main["sound"]["global_mute"] == True: return
        sound_object = sound_lib.stream.FileStream(file="%s/%s" %
                                                   (self.path, sound))
        sound_object.volume = float(config.main["sound"]["volume"])
        self.files.append(sound_object)
        sound_object.play()
Exemplo n.º 4
0
Arquivo: main.py Projeto: Oire/TWBlue
 def get_trending_topics(self, event=None):
  info = self.twitter.twitter.get_available_trends()
  trendingDialog = dialogs.trending.trendingTopicsDialog(info)
  if trendingDialog.ShowModal() == wx.ID_OK:
   if trendingDialog.country.GetValue() == True:
    woeid = trendingDialog.countries[trendingDialog.location.GetStringSelection()]
   elif trendingDialog.city.GetValue() == True:
    woeid = trendingDialog.cities[trendingDialog.location.GetStringSelection()]
   buff = buffers.trendsPanel(self.nb, self, "%s_tt" % (woeid,), argumento=woeid, sound="trends_updated.ogg")
   self.nb.InsertSubPage(self.db.settings["buffers"].index(self.db.settings["user_name"]), buff, _(u"Trending topics for %s") % (trendingDialog.location.GetStringSelection(),))
   timer = RepeatingTimer(300, buff.start_streams)
   timer.start()
   num = buff.start_streams()
   config.main["other_buffers"]["trending_topic_buffers"].append(woeid)
   buff.put_items(num)
Exemplo n.º 5
0
Arquivo: sound.py Projeto: Oire/TWBlue
class soundSystem(object):

 def check_soundpack(self):
  """ Checks if the folder where live the current soundpack exists."""
  self.soundpack_OK = False
  if os.path.exists(paths.sound_path(config.main["sound"]["current_soundpack"])):
   self.path = paths.sound_path(config.main["sound"]["current_soundpack"])
   self.soundpack_OK = True
  elif os.path.exists(paths.sound_path("default")):
   self.path = paths.sound_path("default")
   self.soundpack_OK = True
  else:
   self.soundpack_OK = False

 def __init__(self):
  """ Sound Player."""
  # Set the output and input default devices.
  self.output = sound_lib.output.Output()
  self.input = sound_lib.input.Input()
  # Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
  try:
   self.output.set_device(self.output.find_device_by_name(config.main["sound"]["output_device"]))
   self.input.set_device(self.input.find_device_by_name(config.main["sound"]["input_device"]))
  except:
   config.main["sound"]["output_device"] = "Default"
   config.main["sound"]["input_device"] = "Default"

  self.files = []
  self.cleaner = RepeatingTimer(60, self.clear_list)
  self.cleaner.start()
  self.check_soundpack()

 def clear_list(self):
  log.debug("Cleaning sounds... Total sounds found: %i" % len(self.files))
  if self.files == []: return
  for i in xrange(0, len(self.files)):
   if self.files[i].is_playing == False:
    self.files[i].free()
    self.files.pop(i)
  log.debug("Files used now: %i" % len(self.files))

 def play(self, sound, argument=False):
  if self.soundpack_OK == False: return
  if config.main["sound"]["global_mute"] == True: return
  sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound))
  sound_object.volume = float(config.main["sound"]["volume"])
  self.files.append(sound_object)
  sound_object.play()
Exemplo n.º 6
0
	def play_all(self, list_of_urls):
		self.stop()
		self.queue = list_of_urls
		self.play(self.queue[0])
		self.queue.remove(self.queue[0])
		self.worker = RepeatingTimer(5, self.player_function)
		self.worker.start()
Exemplo n.º 7
0
Arquivo: main.py Projeto: Oire/TWBlue
 def init(self, run_streams=False):
  """ Calls the start_stream function for each stream tab."""
  deleted = 0
  for i in range(0, self.nb.GetPageCount()):
   if self.nb.GetPage(i).type == "account" or self.nb.GetPage(i).type == "empty": continue
   if i == self.nb.GetPageCount() and deleted > 0:
    i = i-1
    deleted = deleted-1
#   log.debug(u"Starting stream for %s..." % self.nb.GetPage(i).name_buffer)
   info_event = event.infoEvent(event.EVT_STARTED, 1)
   try:
    if self.nb.GetPage(i).type == "search":
     self.nb.GetPage(i).timer = RepeatingTimer(180, self.nb.GetPage(i).load_search)
     self.nb.GetPage(i).timer.start()
    num = self.nb.GetPage(i).start_streams()
    info_event.SetItem(i, num)
    wx.PostEvent(self, info_event)
   except TwythonError as e:
    continue
   except UnicodeDecodeError: # This happens when there is a bad internet connection
    continue
  output.speak(_(u"Ready"))

  if run_streams == True:
   self.get_home()
   self.get_tls()
   self.check_streams = RepeatingTimer(config.main["general"]["time_to_check_streams"], self.check_stream_up)
   self.check_streams.start()
  # If all it's done, then play a nice sound saying that all it's OK.
  sound.player.play("ready.ogg")
  autocompletionUsersSettings.execute_at_startup(window=self)
Exemplo n.º 8
0
Arquivo: main.py Projeto: Oire/TWBlue
 def search(self, ev=None):
  dlg = dialogs.search.searchDialog()
  if dlg.ShowModal() == wx.ID_OK:
   term = dlg.term.GetValue()
   if dlg.tweets.GetValue() == True:
    search =buffers.searchPanel(self.nb, self, "%s-search" % (term,), q=term, count=100)
    self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), search, _(u"search for %s") % (term,))
    self.db.settings["buffers"].append("%s-search" % (term,))
    config.main["other_buffers"]["tweet_searches"].append(term)
   elif dlg.users.GetValue() == True:
    search =buffers.searchUsersPanel(self.nb, self, "%s_search" % (term,), q=term, count=20)
    self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), search, _(u"search users for %s") % (term,))
    self.db.settings["buffers"].append("%s_search" % (term,))
   timer = RepeatingTimer(180, search.load_search)
   timer.start()
   num = search.start_streams()
   search.put_items(num)
  dlg.Destroy()
Exemplo n.º 9
0
    def __init__(self):
        """ Sound Player."""
        # Set the output and input default devices.
        self.output = sound_lib.output.Output()
        self.input = sound_lib.input.Input()
        # Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
        try:
            self.output.set_device(
                self.output.find_device_by_name(
                    config.main["sound"]["output_device"]))
            self.input.set_device(
                self.input.find_device_by_name(
                    config.main["sound"]["input_device"]))
        except:
            config.main["sound"]["output_device"] = "Default"
            config.main["sound"]["input_device"] = "Default"

        self.files = []
        self.cleaner = RepeatingTimer(60, self.clear_list)
        self.cleaner.start()
        self.check_soundpack()
Exemplo n.º 10
0
 def __init__(self, soundConfig):
  """ Sound Player."""
  self.config = soundConfig
  # Set the output and input default devices.
  try:
   self.output = sound_lib.output.Output()
   self.input = sound_lib.input.Input()
  except:
   pass
   # Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
  try:
   log.debug("Setting input and output devices...")
   self.output.set_device(self.output.find_device_by_name(self.config["output_device"]))
   self.input.set_device(self.input.find_device_by_name(self.config["input_device"]))
  except:
   log.error("Error in input or output devices, using defaults...")
   self.config["output_device"] = "Default"
   self.config["input_device"] = "Default"

  self.files = []
  self.cleaner = RepeatingTimer(60, self.clear_list)
  self.cleaner.start()
  self.check_soundpack()
Exemplo n.º 11
0
Arquivo: sound.py Projeto: Oire/TWBlue
 def __init__(self):
  """ Sound Player."""
  # Set the output and input default devices.
  self.output = sound_lib.output.Output()
  self.input = sound_lib.input.Input()
  # Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
  try:
   self.output.set_device(self.output.find_device_by_name(config.main["sound"]["output_device"]))
   self.input.set_device(self.input.find_device_by_name(config.main["sound"]["input_device"]))
  except:
   config.main["sound"]["output_device"] = "Default"
   config.main["sound"]["input_device"] = "Default"

  self.files = []
  self.cleaner = RepeatingTimer(60, self.clear_list)
  self.cleaner.start()
  self.check_soundpack()
Exemplo n.º 12
0
	def login(self):
		self.window.change_status(_(u"Logging in VK"))
		self.session.login()
		self.window.change_status(_(u"Ready"))
		for i in self.buffers:
			if hasattr(i, "get_items"):
				# Translators: {0} will be replaced with the name of a buffer.
				self.window.change_status(_(u"Loading items for {0}").format(i.name,))
				i.get_items()
		self.window.change_status(_(u"Ready"))
		self.longpool = longpoolthread.worker(self.session)
		self.longpool.start()
		self.status_setter = RepeatingTimer(900, self.set_online)
		self.status_setter.start()
		self.set_online()
		self.create_unread_messages()
		wx.CallAfter(self.get_audio_albums, self.session.user_id)
		wx.CallAfter(self.get_video_albums, self.session.user_id)
Exemplo n.º 13
0
	def __init__(self, soundConfig):
		""" Sound Player."""
		self.config = soundConfig
		# Set the output and input default devices.
		try:
			self.output = sound_lib.output.Output()
			self.input = sound_lib.input.Input()
		except:
			pass
   # Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
		try:
			log.debug("Setting input and output devices...")
			self.output.set_device(self.output.find_device_by_name(self.config["output_device"]))
			self.input.set_device(self.input.find_device_by_name(self.config["input_device"]))
		except:
			log.error("Error in input or output devices, using defaults...")
			self.config["output_device"] = "Default"
			self.config["input_device"] = "Default"

		self.files = []
		self.cleaner = RepeatingTimer(60, self.clear_list)
		self.cleaner.start()
		self.check_soundpack()
Exemplo n.º 14
0
class audioPlayer(object):

	def __init__(self):
		self.is_playing = False
		self.stream = None
		self.vol = 100
		self.is_working = False
		self.queue = []
		self.stopped = True

	def play(self, url, set_info=True):
		if self.stream != None and self.stream.is_playing == True:
			try:
				self.stream.stop()
			except BassError:
				log.exception("error when stopping the file")
				self.stream = None
			self.stopped = True
			if hasattr(self, "worker") and self.worker != None:
				self.worker.cancel()
				self.worker = None
				self.queue = []
		# Make sure that  there are no other sounds trying to be played.
		if self.is_working == False:
			self.is_working = True
			try:
				self.stream = URLStream(url=url["url"])
			except BassError:
				log.debug("Error when playing the file %r") % (url,)
				return
			# Translators: {0} will be replaced with a song's title and {1} with the artist.
			if set_info:
				msg = _(u"Playing {0} by {1}").format(url["title"], url["artist"])
				pub.sendMessage("update-status-bar", status=msg)
			self.stream.volume = self.vol/100.0
			self.stream.play()
			self.stopped = False
			self.is_working = False

	def stop(self):
		if self.stream != None and self.stream.is_playing == True:
			self.stream.stop()
			self.stopped = True
		if hasattr(self, "worker") and self.worker != None:
			self.worker.cancel()
			self.worker = None
			self.queue = []

	def pause(self):
		if self.stream != None:
			if self.stream.is_playing == True:
				self.stream.pause()
				self.stopped = True
			else:
				try:
					self.stream.play()
					self.stopped = False
				except BassError:
					pass

	@property
	def volume(self):
		if self.stream != None:
			return self.vol

	@volume.setter
	def volume(self, vol):
		if vol <= 100 and vol >= 0:
			self.vol = vol
		if self.stream != None:
			self.stream.volume = self.vol/100.0

	def play_all(self, list_of_urls):
		self.stop()
		self.queue = list_of_urls
		self.play(self.queue[0])
		self.queue.remove(self.queue[0])
		self.worker = RepeatingTimer(5, self.player_function)
		self.worker.start()

	def player_function(self):
		if self.stream != None and self.stream.is_playing == False and self.stopped == False and len(self.stream) == self.stream.position:
			if len(self.queue) == 0:
				self.worker.cancel()
				return
			self.play(self.queue[0])
			self.queue.remove(self.queue[0])

	def check_is_playing(self):
		if self.stream == None:
			return False
		if self.stream != None and self.stream.is_playing == False:
			return False
		else:
			return True
Exemplo n.º 15
0
Arquivo: main.py Projeto: Oire/TWBlue
 def logging_in_twblue(self, panel):
  log.debug("Retrieving username...")
  twitter.starting.start_user_info(config=self.db, twitter=self.twitter)
  config.main["twitter"]["user_name"] = self.db.settings["user_name"]
  self.SetTitle(u"@%s. - TW Blue" % (self.db.settings["user_name"]))
  self.nb = wx.Treebook(panel, -1)
  self.Bind(wx.EVT_CLOSE, self.close)
  self.nb.Bind(wx.EVT_TREEBOOK_PAGE_CHANGED, self.onPageChanged)
  # Gets the tabs for home, mentions, send and direct messages.
  log.debug("Creating buffers...")
  self.db.settings["buffers"] = []
  account = buffers.accountPanel(self.nb, self.db.settings["user_name"])
  self.nb.AddPage(account, self.db.settings["user_name"])
  self.db.settings["buffers"].append(self.db.settings["user_name"])
  account_index = self.db.settings["buffers"].index(self.db.settings["user_name"])
  home = buffers.basePanel(self.nb, self, "home_timeline", self.twitter.twitter.get_home_timeline, sound="tweet_received.ogg")
  self.nb.InsertSubPage(account_index, home, _(u"Home"))
  self.db.settings["buffers"].append("home_timeline")
  self.nb.SetSelection(1)
  self.nb.GetPage(1).list.list.SetFocus()
  mentionsP = buffers.basePanel(self.nb, self, "mentions", self.twitter.twitter.get_mentions_timeline, sound="mention_received.ogg")
  self.nb.InsertSubPage(account_index, mentionsP, _("Mentions"))
  self.db.settings["buffers"].append("mentions")
  dms = buffers.dmPanel(self.nb, self, "direct_messages", self.twitter.twitter.get_direct_messages, sound="dm_received.ogg")
  self.nb.InsertSubPage(account_index, dms, _(u"Direct messages"))
  self.db.settings["buffers"].append("direct_messages")
  sent = buffers.basePanel(self.nb, self, "sent", self.twitter.twitter.get_user_timeline, argumento=self.db.settings["user_name"])
  self.nb.InsertSubPage(account_index, sent, _(u"Sent"))
  self.db.settings["buffers"].append("sent")
# If the user has enabled favs from config.
  if config.main["other_buffers"]["show_favourites"] == True:
   log.debug("Getting Favorited tweets...")
   favs = buffers.basePanel(self.nb, self, "favs", self.twitter.twitter.get_favorites)
   self.nb.InsertSubPage(account_index, favs, _(u"Favourites"))
   self.db.settings["buffers"].append("favs")
# If followers are enabled from config.
  if config.main["other_buffers"]["show_followers"] == True:
   log.debug("Getting followers...")
   followers = buffers.peoplePanel(self.nb, self, "followers", self.twitter.twitter.get_followers_list, argumento=self.db.settings["user_name"], sound="update_followers.ogg")
   self.nb.InsertSubPage(account_index, followers, _(u"Followers"))
   self.db.settings["buffers"].append("followers")
  # Same here but for friends.
  if config.main["other_buffers"]["show_friends"] == True:
   log.debug("Getting friends...")
   friends = buffers.peoplePanel(self.nb, self, "friends", self.twitter.twitter.get_friends_list, argumento=self.db.settings["user_name"])
   self.nb.InsertSubPage(account_index, friends, _(u"Friends"))
   self.db.settings["buffers"].append("friends")
  if config.main["other_buffers"]["show_blocks"] == True:
   blocked = buffers.peoplePanel(self.nb, self, "blocks", self.twitter.twitter.list_blocks)
   self.nb.InsertSubPage(account_index, blocked, _(u"Blocked users"))
   self.db.settings["buffers"].append("blocks")
  if config.main["other_buffers"]["show_muted_users"] == True:
   muteds = buffers.peoplePanel(self.nb, self, "muteds", self.twitter.twitter.get_muted_users_list)
   self.nb.InsertSubPage(account_index, muteds, _(u"Muted users"))
   self.db.settings["buffers"].append("muteds")
  if config.main["other_buffers"]["show_events"] == True:
   evt = buffers.eventsPanel(self.nb, self, sound="new_event.ogg")
   self.nb.InsertSubPage(account_index, evt, _(u"Events"))
   self.db.settings["buffers"].append("events")
  searches = buffers.emptyPanel(self.nb)
  self.nb.InsertSubPage(account_index, searches, _(u"Searches"))
  self.db.settings["buffers"].append("searches")

  for i in config.main["other_buffers"]["tweet_searches"]:
   self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), buffers.searchPanel(self.nb, self, "%s-search" % (i,), q=i, count=100), _(u"Search for %s" % (i,)))
   self.db.settings["buffers"].append("%s-search" % (i,))
  timelines = buffers.emptyPanel(self.nb)
  self.nb.InsertSubPage(account_index, timelines, _(u"Timelines"))
  self.db.settings["buffers"].append("timelines")
  for i in config.main["other_buffers"]["timelines"]:
   self.nb.InsertSubPage(self.db.settings["buffers"].index("timelines"), buffers.basePanel(self.nb, self, i, self.twitter.twitter.get_user_timeline, argumento=i, timeline=True, sound="tweet_timeline.ogg"), _(u"Timeline for %s") % i)
   self.db.settings["buffers"].append(i)
  lists = buffers.emptyPanel(self.nb)
  self.nb.InsertSubPage(account_index, lists, _(u"Lists"))
  self.db.settings["buffers"].append("lists")
  for i in config.main["other_buffers"]["lists"]:
   self.nb.InsertSubPage(self.db.settings["buffers"].index("lists"), buffers.listPanel(self.nb, self, i+"-list", argumento=twitter.utils.find_list(i, self.db.settings["lists"])), _(u"List for %s") % i)
   self.db.settings["buffers"].append(i+"-list")

  ## favourites timelines
  favs_timelines = buffers.emptyPanel(self.nb)
  self.nb.InsertSubPage(account_index, favs_timelines, _(U"Favourites timelines"))
  self.db.settings["buffers"].append("favourites_timelines")
  for i in config.main["other_buffers"]["favourites_timelines"]:
   self.nb.InsertSubPage(self.db.settings["buffers"].index("favourites_timelines"), buffers.favsPanel(self.nb, self, i+"favs", argumento=i, sound="favourites_timeline_updated.ogg"), _(u"Favourites for %s") % i,)
   self.db.settings["buffers"].append(i+"favs")
  self.fav_stream = RepeatingTimer(180, self.get_fav_buffers)
  self.fav_stream.start()
  for i in config.main["other_buffers"]["trending_topic_buffers"]:
   buff = buffers.trendsPanel(self.nb, self, "%s_tt" % (i,), argumento=i, sound="trends_updated.ogg")
   timer = RepeatingTimer(300, buff.start_streams)
   timer.start()
   num = buff.start_streams()
   buff.put_items(num)
   self.nb.InsertSubPage(self.db.settings["buffers"].index(self.db.settings["user_name"]), buff, _(u"Trending topics for %s") % (buff.name,))
  self.sizer.Add(self.nb, 0, wx.ALL, 5)
  if config.main["general"]["use_invisible_keyboard_shorcuts"] == True:
   km = self.create_invisible_keyboard_shorcuts()
   self.register_invisible_keyboard_shorcuts(km)
  panel.SetSizer(self.sizer)
  self.SetClientSize(self.sizer.CalcMin())
  self.Bind(event.MyEVT_STARTED, self.onInit)
  self.Bind(event.EVT_RESULT, self.onMemberAdded)
  pub.subscribe(self.listen_streamerror, "streamError")
  pub.subscribe(self.listen_for_friends, "friendsReceived")
  call_threaded(self.init, run_streams=True)
Exemplo n.º 16
0
class Controller(object):

	def search(self, tab_name):
		for i in xrange(0, len(self.buffers)):
			if self.buffers[i].name == tab_name:
				return self.buffers[i]
		return False

	def get_current_buffer(self):
		""" Get the current bufferObject"""
		buffer = self.window.get_current_buffer()
		if hasattr(buffer, "name"):
			buffer = self.search(buffer.name)
			return buffer

	def __init__(self):
		super(Controller, self).__init__()
		log.debug("Starting main controller...")
		self.buffers = []
		player.setup()
		self.window = mainWindow.mainWindow()
		log.debug("Main window created")
		self.window.change_status(_(u"Ready"))
		self.session = session.sessions[session.sessions.keys()[0]]
		self.create_controls()
		self.window.Show()
		self.connect_events()
		call_threaded(updater.do_update)

	def create_controls(self):
		log.debug("Creating controls for the window...")
		posts_ = buffers.empty(parent=self.window.tb, name="posts")
		self.buffers.append(posts_)
		# Translators: Name for the posts tab in the tree view.
		self.window.add_buffer(posts_.tab, _(u"Posts"))
		home = buffers.baseBuffer(parent=self.window.tb, name="home_timeline", session=self.session, composefunc="compose_new", endpoint="newsfeed", count=self.session.settings["buffers"]["count_for_wall_buffers"])
		self.buffers.append(home)
		# Translators: Newsfeed's name in the tree view.
		self.window.insert_buffer(home.tab, _(u"Home"), self.window.search("posts"))
		self.repeatedUpdate = RepeatingTimer(180, self.update_all_buffers)
		self.repeatedUpdate.start()

		self.readMarker = RepeatingTimer(120, self.mark_as_read)
		self.readMarker.start()

		feed = buffers.feedBuffer(parent=self.window.tb, name="me_feed", composefunc="compose_status", session=self.session, endpoint="get", parent_endpoint="wall", extended=1, count=self.session.settings["buffers"]["count_for_wall_buffers"])
		self.buffers.append(feed)
		# Translators: Own user's wall name in the tree view.
		self.window.insert_buffer(feed.tab, _(u"My wall"), self.window.search("posts"))
		audios = buffers.empty(parent=self.window.tb, name="audios")
		self.buffers.append(audios)
		# Translators: name for the music category in the tree view.
		self.window.add_buffer(audios.tab, _(u"Music"))

		audio = buffers.audioBuffer(parent=self.window.tb, name="me_audio", composefunc="compose_audio", session=self.session, endpoint="get", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"])
		self.buffers.append(audio)
		self.window.insert_buffer(audio.tab, _(u"My audios"), self.window.search("audios"))
		p_audio = buffers.audioBuffer(parent=self.window.tb, name="popular_audio", composefunc="compose_audio", session=self.session, endpoint="getPopular", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"])
		self.buffers.append(p_audio)
		self.window.insert_buffer(p_audio.tab, _(u"Populars"), self.window.search("audios"))
		r_audio = buffers.audioBuffer(parent=self.window.tb, name="recommended_audio", composefunc="compose_audio", session=self.session, endpoint="getRecommendations", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"])
		self.buffers.append(r_audio)
		self.window.insert_buffer(r_audio.tab, _(u"Recommendations"), self.window.search("audios"))
		albums = buffers.empty(parent=self.window.tb, name="albums")
		self.buffers.append(albums)
		self.window.insert_buffer(albums.tab, _(u"Albums"), self.window.search("audios"))

		videos = buffers.empty(parent=self.window.tb, name="videos")
		self.buffers.append(videos)
		# Translators: name for the videos category in the tree view.
		self.window.add_buffer(videos.tab, _(u"Video"))
		my_videos = buffers.videoBuffer(parent=self.window.tb, name="me_video", composefunc="compose_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"])
		self.buffers.append(my_videos)
		self.window.insert_buffer(my_videos.tab, _(u"My videos"), self.window.search("videos"))
		video_albums = buffers.empty(parent=self.window.tb, name="video_albums")
		self.buffers.append(video_albums)
		self.window.insert_buffer(video_albums.tab, _(u"Albums"), self.window.search("videos"))

		people = buffers.empty(parent=self.window.tb, name="people")
		self.buffers.append(people)
		self.window.add_buffer(people.tab, _(u"People"))
		friends = buffers.peopleBuffer(parent=self.window.tb, name="friends_", composefunc="compose_person", session=self.session, endpoint="get", parent_endpoint="friends", count=5000, fields="uid, first_name, last_name, last_seen")
		self.buffers.append(friends)
		self.window.insert_buffer(friends.tab, _(u"Friends"), self.window.search("people"))

		requests_ = buffers.empty(parent=self.window.tb, name="requests")
		self.buffers.append(requests_)
		self.window.insert_buffer(requests_.tab, _(u"Friendship requests"), self.window.search("people"))
		incoming_requests = buffers.requestsBuffer(parent=self.window.tb, name="friend_requests", composefunc="compose_person", session=self.session, count=1000)
		self.buffers.append(incoming_requests)
		self.window.insert_buffer(incoming_requests.tab, _(u"Followers"), self.window.search("requests"))
		outgoing_requests = buffers.requestsBuffer(parent=self.window.tb, name="friend_requests_sent", composefunc="compose_person", session=self.session, count=1000, out=1)
		self.buffers.append(outgoing_requests)
		self.window.insert_buffer(outgoing_requests.tab, _(u"I follow"), self.window.search("requests"))

		chats = buffers.empty(parent=self.window.tb, name="chats")
		self.buffers.append(chats)
		self.window.add_buffer(chats.tab, _(u"Chats"))
		timelines = buffers.empty(parent=self.window.tb, name="timelines")
		self.buffers.append(timelines)
		self.window.add_buffer(timelines.tab, _(u"Timelines"))
		self.window.realize()

	def connect_events(self):
		log.debug("Connecting events to responses...")
		pub.subscribe(self.in_post, "posted")
		pub.subscribe(self.download, "download-file")
		pub.subscribe(self.play_audio, "play-audio")
		pub.subscribe(self.play_audios, "play-audios")
		pub.subscribe(self.view_post, "open-post")
		pub.subscribe(self.update_status_bar, "update-status-bar")
		pub.subscribe(self.chat_from_id, "new-chat")
		pub.subscribe(self.authorisation_failed, "authorisation-failed")
		pub.subscribe(self.user_profile, "user-profile")
		widgetUtils.connect_event(self.window, widgetUtils.CLOSE_EVENT, self.exit)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.update_buffer, menuitem=self.window.update_buffer)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.check_for_updates, menuitem=self.window.check_for_updates)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.window.about_dialog, menuitem=self.window.about)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.search_audios, menuitem=self.window.search_audios)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.search_videos, menuitem=self.window.search_videos)
		widgetUtils.connect_event(self.window, widgetUtils.MENU,self.remove_buffer, menuitem=self.window.remove_buffer_)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.get_more_items, menuitem=self.window.load_previous_items)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.changelog, menuitem=self.window.changelog)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.configuration, menuitem=self.window.settings_dialog)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.new_timeline, menuitem=self.window.timeline)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.create_audio_album, menuitem=self.window.audio_album)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.delete_audio_album, menuitem=self.window.delete_audio_album)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.create_video_album, menuitem=self.window.video_album)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.delete_video_album, menuitem=self.window.delete_video_album)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.check_documentation, menuitem=self.window.documentation)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.menu_play_pause, menuitem=self.window.player_play)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.menu_play_next, menuitem=self.window.player_next)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.menu_play_previous, menuitem=self.window.player_previous)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.menu_play_all, menuitem=self.window.player_play_all)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.menu_stop, menuitem=self.window.player_stop)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.menu_volume_down, menuitem=self.window.player_volume_down)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.menu_volume_up, menuitem=self.window.player_volume_up)
		widgetUtils.connect_event(self.window, widgetUtils.MENU, self.menu_mute, menuitem=self.window.player_mute)
		pub.subscribe(self.get_chat, "order-sent-message")

	def disconnect_events(self):
		log.debug("Disconnecting some events...")
		pub.unsubscribe(self.in_post, "posted")
		pub.unsubscribe(self.download, "download-file")
		pub.unsubscribe(self.play_audio, "play-audio")
		pub.unsubscribe(self.authorisation_failed, "authorisation-failed")
		pub.unsubscribe(self.play_audios, "play-audios")
		pub.unsubscribe(self.view_post, "open-post")
		pub.unsubscribe(self.update_status_bar, "update-status-bar")

	def authorisation_failed(self):
		commonMessages.bad_authorisation()

	def login(self):
		self.window.change_status(_(u"Logging in VK"))
		self.session.login()
		self.window.change_status(_(u"Ready"))
		for i in self.buffers:
			if hasattr(i, "get_items"):
				# Translators: {0} will be replaced with the name of a buffer.
				self.window.change_status(_(u"Loading items for {0}").format(i.name,))
				i.get_items()
		self.window.change_status(_(u"Ready"))
		self.longpool = longpoolthread.worker(self.session)
		self.longpool.start()
		self.status_setter = RepeatingTimer(900, self.set_online)
		self.status_setter.start()
		self.set_online()
		self.create_unread_messages()
		wx.CallAfter(self.get_audio_albums, self.session.user_id)
		wx.CallAfter(self.get_video_albums, self.session.user_id)

	def in_post(self, buffer):
		buffer = self.search(buffer)
		buffer.get_items()
		buffer = self.search("home_timeline")
		buffer.get_items()

	def update_all_buffers(self):
		log.debug("Updating buffers...")
		self.session.audio_albums = self.session.vk.client.audio.getAlbums(owner_id=self.session.user_id)["items"]
		for i in self.buffers:
			if hasattr(i, "get_items"):
				i.get_items()
				log.debug(u"Updated %s" % (i.name))

	def download(self, url, filename):
		log.debug(u"downloading %s URL to %s filename" % (url, filename,))
		call_threaded(utils.download_file, url, filename, self.window)

	def play_audio(self, audio_object):
		call_threaded(player.player.play, audio_object)

	def play_audios(self, audios):
		player.player.play_all(audios)

	def view_post(self, post_object, controller_):
		p = getattr(posts, controller_)(self.session, post_object)
		p.dialog.get_response()
		p.dialog.Destroy()

	def exit(self, *args, **kwargs):
		log.debug("Receibed an exit signal. closing...")
		self.disconnect_events()
		self.window.Destroy()
		wx.GetApp().ExitMainLoop()

	def update_buffer(self, *args, **kwargs):
		b = self.get_current_buffer()
		b.get_items()

	def get_more_items(self, *args, **kwargs):
		b = self.get_current_buffer()
		b.get_more_items()

	def check_for_updates(self, *args, **kwargs):
		update = updater.do_update()
		if update == False:
			commonMessages.no_update_available()

	def search_audios(self, *args, **kwargs):
		dlg = searchDialogs.searchAudioDialog()
		if dlg.get_response() == widgetUtils.OK:
			q = dlg.get("term").encode("utf-8")
			count = 300
			auto_complete = dlg.get_checkable("auto_complete")
			lyrics = dlg.get_checkable("lyrics")
			performer_only = dlg.get_checkable("artist_only")
			sort = dlg.get_sort_order()
			newbuff = buffers.audioBuffer(parent=self.window.tb, name=u"{0}_audiosearch".format(q.decode("utf-8"),), session=self.session, composefunc="compose_audio", parent_endpoint="audio", endpoint="search", q=q, count=count, auto_complete=auto_complete, lyrics=lyrics, performer_only=performer_only, sort=sort)
			self.buffers.append(newbuff)
			call_threaded(newbuff.get_items)
			# Translators: {0} will be replaced with the search term.
			self.window.insert_buffer(newbuff.tab, _(u"Search for {0}").format(q.decode("utf-8"),), self.window.search("audios"))

	def search_videos(self, *args, **kwargs):
		dlg = searchDialogs.searchVideoDialog()
		if dlg.get_response() == widgetUtils.OK:
			params = {}
			params["q"] = dlg.get("term").encode("utf-8")
			params["count"] = 200
			hd = dlg.get_checkable("hd")
			if hd != 0:
				params["hd"] = 1
			params["adult"] = dlg.get_checkable("safe_search")
			params["sort"] = dlg.get_sort_order()
			params["filters"] = "youtube, vimeo, short, long"
			newbuff = buffers.videoBuffer(parent=self.window.tb, name=u"{0}_videosearch".format(params["q"].decode("utf-8"),), session=self.session, composefunc="compose_video", parent_endpoint="video", endpoint="search", **params)
			self.buffers.append(newbuff)
			call_threaded(newbuff.get_items)
			# Translators: {0} will be replaced with the search term.
			self.window.insert_buffer(newbuff.tab, _(u"Search for {0}").format(params["q"].decode("utf-8"),), self.window.search("videos"))

	def update_status_bar(self, status):
		self.window.change_status(status)

	def remove_buffer(self, event, mandatory=False, *args, **kwargs):
		buffer = self.get_current_buffer()
		buff = self.window.search(buffer.name)
		answer = buffer.remove_buffer(mandatory)
		if answer == False:
			return
		self.window.remove_buffer(buff)
		self.buffers.remove(buffer)
		del buffer

	def changelog(self, *args, **kwargs):
		os.chdir("documentation")
		webbrowser.open("changelog.html")
		os.chdir("../")

	def configuration(self, *args, **kwargs):
		""" Opens the global settings dialogue."""
		d = configuration.configuration(self.session)
		if d.response == widgetUtils.OK:
			d.save_configuration()

	def new_timeline(self, *args, **kwargs):
		b = self.get_current_buffer()
		if not hasattr(b, "get_users"):
			b = self.search("home_timeline")
		d = []
		for i in self.session.db["users"]:
			d.append((i, self.session.get_user_name(i, "nom")))
		for i in self.session.db["groups"]:
			d.append((-i, self.session.get_user_name(-i)))
		a = timeline.timelineDialog([i[1] for i in d])
		if a.get_response() == widgetUtils.OK:
			user = a.get_user()
			buffertype = a.get_buffer_type()
			user_id = ""
			for i in d:
				if i[1] == user:
					user_id = i[0]
			if user_id == None:
				commonMessages.no_user_exist()
				return
			print user_id
			if buffertype == "audio":
				buffer = buffers.audioBuffer(parent=self.window.tb, name="{0}_audio".format(user_id,), composefunc="compose_audio", session=self.session, endpoint="get", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"], owner_id=user_id)
				# Translators: {0} will be replaced with an user.
				name_ = _(u"{0}'s audios").format(self.session.get_user_name(user_id, "gen"),)
			elif buffertype == "wall":
				buffer = buffers.feedBuffer(parent=self.window.tb, name="{0}_feed".format(user_id,), composefunc="compose_status", session=self.session, endpoint="get", parent_endpoint="wall", extended=1, count=self.session.settings["buffers"]["count_for_wall_buffers"],  owner_id=user_id)
				# Translators: {0} will be replaced with an user.
				name_ = _(u"{0}'s wall posts").format(self.session.get_user_name(user_id, "gen"),)
			elif buffertype == "friends":
				buffer = buffers.peopleBuffer(parent=self.window.tb, name="friends_{0}".format(user_id,), composefunc="compose_person", session=self.session, endpoint="get", parent_endpoint="friends", count=5000, fields="uid, first_name, last_name, last_seen", user_id=user_id)
				# Translators: {0} will be replaced with an user.
				name_ = _(u"{0}'s friends").format(self.session.get_user_name(user_id, "friends"),)
			self.buffers.append(buffer)
			call_threaded(self.complete_buffer_creation, buffer=buffer, name_=name_, position=self.window.search("timelines"))

	def complete_buffer_creation(self, buffer, name_, position):
		answer = buffer.get_items()
		if answer is not True:
			self.buffers.remove(buffer)
			del buffer
			commonMessages.show_error_code(answer)
			return
		self.window.insert_buffer(buffer.tab, name_, position)

	def search_chat_buffer(self, user_id):
		for i in self.buffers:
			if "_messages" in i.name:
				if i.kwargs.has_key("user_id") and i.kwargs["user_id"] == user_id: return i
		return None

	def chat_from_id(self, user_id, setfocus=True):
		b = self.search_chat_buffer(user_id)
		if b != None:
			pos = self.window.search(b.name)
			if setfocus:
				self.window.change_buffer(pos)
				return b.tab.text.SetFocus()
			return
		buffer = buffers.chatBuffer(parent=self.window.tb, name="{0}_messages".format(user_id,), composefunc="compose_message", session=self.session, count=200,  user_id=user_id, rev=1)
		self.buffers.append(buffer)
		# Translators: {0} will be replaced with an user.
		self.window.insert_buffer(buffer.tab, _(u"Chat with {0}").format(self.session.get_user_name(user_id, "ins")), self.window.search("chats"))
		if setfocus:
			pos = self.window.search(buffer.name)
			self.window.change_buffer(pos)
		wx.CallAfter(buffer.get_items)
		if setfocus: buffer.tab.text.SetFocus()
		return True

	def get_chat(self, obj=None):
		""" Searches or creates a chat buffer with the id of the user that is sending or receiving a message.
			obj vk.longpool.event: an event wich defines some data from the vk's longpool server."""
		# Set user_id to the id of the friend wich is receiving or sending the message.
		obj.user_id = obj.from_id
		buffer = self.search_chat_buffer(obj.user_id)
		if buffer == None:
			wx.CallAfter(self.chat_from_id, obj.user_id)
			self.session.soundplayer.play("chat.ogg")
			return
		# If the chat already exists, let's create a dictionary wich will contains data of the received message.
		message = {"id": obj.message_id, "user_id": obj.user_id, "date": obj.timestamp, "body": obj.text, "attachments": obj.attachments}
		# If outbox it's true, it means that message["from_id"] should be the current user. If not, the obj.user_id should be taken.
		if obj.message_flags.has_key("outbox") == True:
			message["from_id"] = self.session.user_id
		else:
			message["from_id"] = obj.from_id
		data = [message]
		# Let's add this to the buffer.
		# ToDo: Clean this code and test how is the database working with this set to True.
		num = self.session.order_buffer(buffer.name, data, True)
		buffer.insert(self.session.db[buffer.name]["items"][-1], False)
		self.session.soundplayer.play("chat.ogg")

	def set_online(self):
		try:
			r = self.session.vk.client.account.setOnline()
		except:
			log.error("Error in setting online for the current user")

	def create_unread_messages(self):
		try:
			log.debug("Getting possible unread messages.")
			msgs = self.session.vk.client.messages.getDialogs(count=200, unread=1)
		except VkAPIMethodError as ex:
			if ex.code == 6:
				log.exception("Something went wrong when getting messages. Waiting a second to retry")
				time.sleep(2)
				return self.create_unread_messages()
		for i in msgs["items"]:
			wx.CallAfter(self.chat_from_id, i["message"]["user_id"], setfocus=False)

	def mark_as_read(self):
		ids = ""
		for i in self.buffers:
			if hasattr(i, "reads"):
				for z in i.reads:
					ids = ids+"%d," % (z,)
				i.reads = []
		if ids != "":
			response = self.session.vk.client.messages.markAsRead(message_ids=ids)

	def get_audio_albums(self, user_id=None):
		try:
			log.debug("Create audio albums...")
			albums = self.session.vk.client.audio.getAlbums(owner_id=user_id)
		except VkAPIMethodError as ex:
			if ex.code == 6:
				log.exception("Something went wrong when getting albums. Waiting a second to retry")
				time.sleep(2)
				return self.get_audio_albums(user_id=user_id)
			elif ex.code == 10:
				return
		self.session.audio_albums = albums["items"]
		for i in albums["items"]:
			buffer = buffers.audioAlbum(parent=self.window.tb, name="{0}_audio_album".format(i["id"],), composefunc="compose_audio", session=self.session, endpoint="get", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"], user_id=user_id, album_id=i["id"])
			buffer.can_get_items = False
			# Translators: {0} Will be replaced with an audio album's title.
			name_ = _(u"Album: {0}").format(i["title"],)
			self.buffers.append(buffer)
			self.window.insert_buffer(buffer.tab, name_, self.window.search("albums"))
			buffer.get_items()
			# inserts a pause of 1 second here, so we'll avoid errors 6 in VK.
			time.sleep(0.3)

	def get_video_albums(self, user_id=None):
		try:
			log.debug("Create video  albums...")
			albums = self.session.vk.client.video.getAlbums(owner_id=user_id)
		except VkAPIMethodError as ex:
			if ex.code == 6:
				log.exception("Something went wrong when getting albums. Waiting a second to retry")
				time.sleep(2)
				return self.get_audio_albums(user_id=user_id)
		self.session.video_albums = albums["items"]
		for i in albums["items"]:
			buffer = buffers.videoAlbum(parent=self.window.tb, name="{0}_video_album".format(i["id"],), composefunc="compose_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"], user_id=user_id, album_id=i["id"])
			buffer.can_get_items = False
			# Translators: {0} Will be replaced with a video  album's title.
			name_ = _(u"Album: {0}").format(i["title"],)
			self.buffers.append(buffer)
			self.window.insert_buffer(buffer.tab, name_, self.window.search("video_albums"))
			buffer.get_items()
			# inserts a pause of 1 second here, so we'll avoid errors 6 in VK.
			time.sleep(0.3)

	def create_audio_album(self, *args, **kwargs):
		d = creation.audio_album()
		if d.get_response() == widgetUtils.OK and d.get("title") != "":
			response = self.session.vk.client.audio.addAlbum(title=d.get("title"))
			if response.has_key("album_id") == False: return
			album_id = response["album_id"]
			buffer = buffers.audioAlbum(parent=self.window.tb, name="{0}_audio_album".format(album_id,), composefunc="compose_audio", session=self.session, endpoint="get", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"], user_id=self.session.user_id, album_id=album_id)
			buffer.can_get_items = False
			# Translators: {0} will be replaced with an audio album's title.
			name_ = _(u"Album: {0}").format(d.get("title"),)
			self.buffers.append(buffer)
			self.window.insert_buffer(buffer.tab, name_, self.window.search("albums"))
			buffer.get_items()
			self.session.audio_albums = self.session.vk.client.audio.getAlbums(owner_id=self.session.user_id)["items"]

	def delete_audio_album(self, *args, **kwargs):
		answer = selector.album(_(u"Select the album you want to delete"), self.session)
		if answer.item == None:
			return
		response = commonMessages.delete_audio_album()
		if response != widgetUtils.YES: return
		removal = self.session.vk.client.audio.deleteAlbum(album_id=answer.item)
		buffer = self.search("{0}_audio_album".format(answer.item,))
		buff = self.window.search(buffer.name)
		self.window.remove_buffer(buff)
		self.buffers.remove(buffer)
		del buffer
		self.session.audio_albums = self.session.vk.client.audio.getAlbums(owner_id=self.session.user_id)["items"]

	def create_video_album(self, *args, **kwargs):
		d = creation.audio_album()
		if d.get_response() == widgetUtils.OK and d.get("title") != "":
			response = self.session.vk.client.video.addAlbum(title=d.get("title"))
			if response.has_key("album_id") == False: return
			album_id = response["album_id"]
			buffer = buffers.videoAlbum(parent=self.window.tb, name="{0}_video_album".format(album_id,), composefunc="compose_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"], user_id=self.session.user_id, album_id=album_id)
			buffer.can_get_items = False
			# Translators: {0} will be replaced with a video  album's title.
			name_ = _(u"Album: {0}").format(d.get("title"),)
			self.buffers.append(buffer)
			self.window.insert_buffer(buffer.tab, name_, self.window.search("video_albums"))
			buffer.get_items()
			self.session.video_albums = self.session.vk.client.video.getAlbums(owner_id=self.session.user_id)["items"]

	def delete_video_album(self, *args, **kwargs):
		answer = selector.album(_(u"Select the album you want to delete"), self.session, "video_albums")
		if answer.item == None:
			return
		response = commonMessages.delete_audio_album()
		if response != widgetUtils.YES: return
		removal = self.session.vk.client.video.deleteAlbum(album_id=answer.item)
		buffer = self.search("{0}_video_album".format(answer.item,))
		buff = self.window.search(buffer.name)
		self.window.remove_buffer(buff)
		self.buffers.remove(buffer)
		del buffer
		self.session.video_albums = self.session.vk.client.video.getAlbums(owner_id=self.session.user_id)["items"]

	def check_documentation(self, *args, **kwargs):
		lang = localization.get("documentation")
		os.chdir("documentation/%s" % (lang,))
		webbrowser.open("manual.html")
		os.chdir("../../")

	def menu_play_pause(self, *args, **kwargs):
		if player.player.check_is_playing() != False:
			return player.player.pause()
		b = self.get_current_buffer()
		if hasattr(b, "play_next"):
			b.play_audio()
		else:
			b = self.search("me_audio")
			b.play_audio()

	def menu_play_next(self, *args, **kwargs):
		b = self.get_current_buffer()
		if hasattr(b, "play_next"):
			b.play_next()
		else:
			self.search("me_audio").play_next()

	def menu_play_previous(self, *args, **kwargs):
		b = self.get_current_buffer()
		if hasattr(b, "play_previous"):
			b.play_previous()
		else:
			self.search("me_audio").play_previous()

	def menu_play_all(self, *args, **kwargs):
		b = self.get_current_buffer()
		if hasattr(b, "play_all"):
			b.play_all()
		else:
			self.search("me_audio").play_all()

	def menu_stop(self, *args, **kwargs):
		player.player.stop()

	def menu_volume_down(self, *args, **kwargs):
		player.player.volume = player.player.volume-5

	def menu_volume_up(self, *args, **kwargs):
		player.player.volume = player.player.volume+5

	def menu_mute(self, *args, **kwargs):
		player.player.volume = 0

	def user_profile(self, person):
		p = posts.userProfile(self.session, person)
Exemplo n.º 17
0
Arquivo: main.py Projeto: Oire/TWBlue
class mainFrame(wx.Frame):
 """ Main class of the Frame. This is the Main Window."""

 ### MENU
 def makeMenus(self):
  """ Creates, bind and returns the menu bar for the application. Also in this function, the accel table is created."""
  menuBar = wx.MenuBar()

  # Application menu
  app = wx.Menu()
  switch_account = app.Append(wx.NewId(), _(u"S&witch account"))
  self.Bind(wx.EVT_MENU, self.switch_account, switch_account)
  updateProfile = app.Append(wx.NewId(), _(u"&Update profile"))
  self.Bind(wx.EVT_MENU, self.update_profile, updateProfile)
  show_hide = app.Append(wx.NewId(), _(u"&Hide window"))
  self.Bind(wx.EVT_MENU, self.show_hide, show_hide)
  search = app.Append(wx.NewId(), _(u"&Search"))
  self.Bind(wx.EVT_MENU, self.search, search)
  trends = app.Append(wx.NewId(), _(u"View &trending topics"))
  self.Bind(wx.EVT_MENU, self.get_trending_topics, trends)
  lists = app.Append(wx.NewId(), _(u"&Lists manager"))
  self.Bind(wx.EVT_MENU, self.list_manager, lists)
  sounds_tutorial = app.Append(wx.NewId(), _(u"Sounds &tutorial"))
  self.Bind(wx.EVT_MENU, self.learn_sounds, sounds_tutorial)
  keystroke_editor = app.Append(wx.NewId(), _(u"&Edit keystrokes"))
  self.Bind(wx.EVT_MENU, self.edit_keystrokes, keystroke_editor)
  prefs = app.Append(wx.ID_PREFERENCES, _(u"&Preferences"))
  self.Bind(wx.EVT_MENU, self.preferences, prefs)
  close = app.Append(wx.ID_EXIT, _(u"E&xit"))
  self.Bind(wx.EVT_MENU, self.close, close)

  # Tweet menu
  tweet = wx.Menu()
  compose = tweet.Append(wx.NewId(), _(u"&Tweet"))
  self.Bind(wx.EVT_MENU, self.compose, compose)
  response = tweet.Append(wx.NewId(), _(u"Re&ply"))
  self.Bind(wx.EVT_MENU, self.reply, response)
  retweet = tweet.Append(wx.NewId(), _(u"&Retweet"))
  self.Bind(wx.EVT_MENU, self.retweet, retweet)
  fav = tweet.Append(wx.NewId(), _(u"Add to &favourites"))
  self.Bind(wx.EVT_MENU, self.fav, fav)
  unfav = tweet.Append(wx.NewId(), _(u"Remove from favo&urites"))
  self.Bind(wx.EVT_MENU, self.unfav, unfav)
  view = tweet.Append(wx.NewId(), _(u"&Show tweet"))
  self.Bind(wx.EVT_MENU, self.view, view)
  view_coordinates = tweet.Append(wx.NewId(), _(u"View &address"))
  self.Bind(wx.EVT_MENU, self.reverse_geocode, view_coordinates)
  delete = tweet.Append(wx.NewId(), _(u"&Delete"))
  self.Bind(wx.EVT_MENU, self.delete, delete)

  # User menu
  user = wx.Menu()
  follow = user.Append(wx.NewId(), _(u"&Follow"))
  self.Bind(wx.EVT_MENU, self.onFollow, follow)
  unfollow = user.Append(wx.NewId(), _(u"&Unfollow"))
  self.Bind(wx.EVT_MENU, self.onUnfollow, unfollow)
  mute = user.Append(wx.NewId(), _(u"&Mute"))
  self.Bind(wx.EVT_MENU, self.onMute, mute)
  unmute = user.Append(wx.NewId(), _(u"U&nmute"))
  self.Bind(wx.EVT_MENU, self.onUnmute, unmute)
  report = user.Append(wx.NewId(), _(u"&Report as spam"))
  self.Bind(wx.EVT_MENU, self.onReport, report)
  block = user.Append(wx.NewId(), _(u"&Block"))
  self.Bind(wx.EVT_MENU, self.onBlock, block)
  unblock = user.Append(wx.NewId(), _(u"Unb&lock"))
  self.Bind(wx.EVT_MENU, self.onUnblock, unblock)
  dm = user.Append(wx.NewId(), _(u"Direct me&ssage"))
  self.Bind(wx.EVT_MENU, self.dm, dm)
  addToList = user.Append(wx.NewId(), _(u"&Add to list"))
  self.Bind(wx.EVT_MENU, self.add_to_list, addToList)
  removeFromList = user.Append(wx.NewId(), _(u"R&emove from list"))
  self.Bind(wx.EVT_MENU, self.remove_from_list, removeFromList)
  viewLists = user.Append(wx.NewId(), _(u"&View lists"))
  self.Bind(wx.EVT_MENU, self.view_user_lists, viewLists)
  details = user.Append(wx.NewId(), _(u"Show user &profile"))
  self.Bind(wx.EVT_MENU, self.details, details)
  timeline = user.Append(wx.NewId(), _(u"&Timeline"))
  self.Bind(wx.EVT_MENU, self.open_timeline, timeline)
  favs = user.Append(wx.NewId(), _(u"V&iew favourites"))
  self.Bind(wx.EVT_MENU, self.favs_timeline, favs)

  # buffer menu
  buffer = wx.Menu()
  load_previous_items = buffer.Append(wx.NewId(), _(u"&Load previous items"))
  self.Bind(wx.EVT_MENU, self.get_more_items, load_previous_items)
  mute = buffer.Append(wx.NewId(), _(u"&Mute"))
  self.Bind(wx.EVT_MENU, self.toggle_mute, mute)
  autoread = buffer.Append(wx.NewId(), _(u"&Autoread tweets for this buffer"))
  self.Bind(wx.EVT_MENU, self.toggle_autoread, autoread)
  clear = buffer.Append(wx.NewId(), _(u"&Clear buffer"))
  self.Bind(wx.EVT_MENU, self.clear_list, clear)
  deleteTl = buffer.Append(wx.NewId(), _(u"&Remove buffer"))
  self.Bind(wx.EVT_MENU, self.delete_buffer, deleteTl)

 # Help Menu
  help = wx.Menu()
  doc = help.Append(-1, _(u"&Documentation"))
  self.Bind(wx.EVT_MENU, self.onManual, doc)
  changelog = help.Append(wx.NewId(), _(u"&What's new in this version?"))
  self.Bind(wx.EVT_MENU, self.onChangelog, changelog)
  check_for_updates = help.Append(wx.NewId(), _(u"&Check for updates"))
  self.Bind(wx.EVT_MENU, self.onCheckForUpdates, check_for_updates)
  reportError = help.Append(wx.NewId(), _(u"&Report an error"))
  self.Bind(wx.EVT_MENU, self.onReportBug, reportError)
  visit_website = help.Append(-1, _(u"TW Blue &website"))
  self.Bind(wx.EVT_MENU, self.onVisit_website, visit_website)
  about = help.Append(-1, _(u"About &TW Blue"))
  self.Bind(wx.EVT_MENU, self.onAbout, about)

  # Add all to the menu Bar
  menuBar.Append(app, _(u"&Application"))
  menuBar.Append(tweet, _(u"&Tweet"))
  menuBar.Append(user, _(u"&User"))
  menuBar.Append(buffer, _(u"&Buffer"))
  menuBar.Append(help, _(u"&Help"))

  downID = wx.NewId()
  upID = wx.NewId()
  leftID = wx.NewId()
  rightID = wx.NewId()
  if platform.system() == "Darwin":
   self.Bind(wx.EVT_MENU, self.down, id=downID)
   self.Bind(wx.EVT_MENU, self.up, id=upID)
   self.Bind(wx.EVT_MENU, self.left, id=leftID)
   self.Bind(wx.EVT_MENU, self.right, id=rightID)

  # Creates the acceleration table.
  self.accel_tbl = wx.AcceleratorTable([
(wx.ACCEL_CTRL, ord('N'), compose.GetId()),
(wx.ACCEL_CTRL, ord('R'), response.GetId()),
(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('R'), retweet.GetId()),
(wx.ACCEL_CTRL, ord('F'), fav.GetId()),
(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), unfav.GetId()),
(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('V'), view.GetId()),
(wx.ACCEL_CTRL, ord('D'), dm.GetId()),

(wx.ACCEL_CTRL, ord('Q'), close.GetId()),
(wx.ACCEL_CTRL, ord('S'), follow.GetId()),
(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('S'), unfollow.GetId()),
(wx.ACCEL_CTRL, ord('K'), block.GetId()),
(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('K'), report.GetId()),
(wx.ACCEL_CTRL, ord('I'), timeline.GetId()),
(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('I'), deleteTl.GetId()),
(wx.ACCEL_CTRL, ord('M'), show_hide.GetId()),
(wx.ACCEL_CTRL, ord('P'), updateProfile.GetId()),
(wx.ACCEL_CTRL, wx.WXK_DOWN, downID),
(wx.ACCEL_CTRL, wx.WXK_UP, upID),
(wx.ACCEL_CTRL, wx.WXK_LEFT, leftID),
(wx.ACCEL_CTRL, wx.WXK_RIGHT, rightID),
  ])

  self.SetAcceleratorTable(self.accel_tbl)
  return menuBar

 ### MAIN
 def __init__(self, authorised=True, user_key=None, user_secret=None):
  """ Main function of this class."""
  if authorised == False:
   self.user_key = user_key
   self.user_secret = user_secret
  else:
   self.user_key = self.user_secret = None
  log.debug("Loading temporal database...")
  self.db = db.db()
  # Gets the twitter object for future calls to the twitter Rest API.
  log.debug("Getting Twitter's Rest API...")
  self.twitter = twitter.twitter.twitter()
  super(mainFrame, self).__init__(None, -1, "TW Blue", size=(1600, 1600))
  wx.GetApp().Bind(wx.EVT_QUERY_END_SESSION, self.exit)
  wx.GetApp().Bind(wx.EVT_END_SESSION, self.exit)
  log.debug(u"Creating the system tray icon... ")
  self.sysTray=sysTrayIcon.SysTrayIcon(self)
  panel = wx.Panel(self)
  self.sizer = wx.BoxSizer(wx.VERTICAL)
  self.SetTitle("TW Blue")
  try:
   updater.update_manager.check_for_update()
  except:
   wx.MessageDialog(self, _(u"An error occurred while looking for an update. It may be due to any problem either on our server or on your DNS servers. Please, try again later."), _(u"Error!"), wx.OK|wx.ICON_ERROR).ShowModal()
  self.SetMenuBar(self.makeMenus())
  self.setup_twitter(panel)

 def logging_in_twblue(self, panel):
  log.debug("Retrieving username...")
  twitter.starting.start_user_info(config=self.db, twitter=self.twitter)
  config.main["twitter"]["user_name"] = self.db.settings["user_name"]
  self.SetTitle(u"@%s. - TW Blue" % (self.db.settings["user_name"]))
  self.nb = wx.Treebook(panel, -1)
  self.Bind(wx.EVT_CLOSE, self.close)
  self.nb.Bind(wx.EVT_TREEBOOK_PAGE_CHANGED, self.onPageChanged)
  # Gets the tabs for home, mentions, send and direct messages.
  log.debug("Creating buffers...")
  self.db.settings["buffers"] = []
  account = buffers.accountPanel(self.nb, self.db.settings["user_name"])
  self.nb.AddPage(account, self.db.settings["user_name"])
  self.db.settings["buffers"].append(self.db.settings["user_name"])
  account_index = self.db.settings["buffers"].index(self.db.settings["user_name"])
  home = buffers.basePanel(self.nb, self, "home_timeline", self.twitter.twitter.get_home_timeline, sound="tweet_received.ogg")
  self.nb.InsertSubPage(account_index, home, _(u"Home"))
  self.db.settings["buffers"].append("home_timeline")
  self.nb.SetSelection(1)
  self.nb.GetPage(1).list.list.SetFocus()
  mentionsP = buffers.basePanel(self.nb, self, "mentions", self.twitter.twitter.get_mentions_timeline, sound="mention_received.ogg")
  self.nb.InsertSubPage(account_index, mentionsP, _("Mentions"))
  self.db.settings["buffers"].append("mentions")
  dms = buffers.dmPanel(self.nb, self, "direct_messages", self.twitter.twitter.get_direct_messages, sound="dm_received.ogg")
  self.nb.InsertSubPage(account_index, dms, _(u"Direct messages"))
  self.db.settings["buffers"].append("direct_messages")
  sent = buffers.basePanel(self.nb, self, "sent", self.twitter.twitter.get_user_timeline, argumento=self.db.settings["user_name"])
  self.nb.InsertSubPage(account_index, sent, _(u"Sent"))
  self.db.settings["buffers"].append("sent")
# If the user has enabled favs from config.
  if config.main["other_buffers"]["show_favourites"] == True:
   log.debug("Getting Favorited tweets...")
   favs = buffers.basePanel(self.nb, self, "favs", self.twitter.twitter.get_favorites)
   self.nb.InsertSubPage(account_index, favs, _(u"Favourites"))
   self.db.settings["buffers"].append("favs")
# If followers are enabled from config.
  if config.main["other_buffers"]["show_followers"] == True:
   log.debug("Getting followers...")
   followers = buffers.peoplePanel(self.nb, self, "followers", self.twitter.twitter.get_followers_list, argumento=self.db.settings["user_name"], sound="update_followers.ogg")
   self.nb.InsertSubPage(account_index, followers, _(u"Followers"))
   self.db.settings["buffers"].append("followers")
  # Same here but for friends.
  if config.main["other_buffers"]["show_friends"] == True:
   log.debug("Getting friends...")
   friends = buffers.peoplePanel(self.nb, self, "friends", self.twitter.twitter.get_friends_list, argumento=self.db.settings["user_name"])
   self.nb.InsertSubPage(account_index, friends, _(u"Friends"))
   self.db.settings["buffers"].append("friends")
  if config.main["other_buffers"]["show_blocks"] == True:
   blocked = buffers.peoplePanel(self.nb, self, "blocks", self.twitter.twitter.list_blocks)
   self.nb.InsertSubPage(account_index, blocked, _(u"Blocked users"))
   self.db.settings["buffers"].append("blocks")
  if config.main["other_buffers"]["show_muted_users"] == True:
   muteds = buffers.peoplePanel(self.nb, self, "muteds", self.twitter.twitter.get_muted_users_list)
   self.nb.InsertSubPage(account_index, muteds, _(u"Muted users"))
   self.db.settings["buffers"].append("muteds")
  if config.main["other_buffers"]["show_events"] == True:
   evt = buffers.eventsPanel(self.nb, self, sound="new_event.ogg")
   self.nb.InsertSubPage(account_index, evt, _(u"Events"))
   self.db.settings["buffers"].append("events")
  searches = buffers.emptyPanel(self.nb)
  self.nb.InsertSubPage(account_index, searches, _(u"Searches"))
  self.db.settings["buffers"].append("searches")

  for i in config.main["other_buffers"]["tweet_searches"]:
   self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), buffers.searchPanel(self.nb, self, "%s-search" % (i,), q=i, count=100), _(u"Search for %s" % (i,)))
   self.db.settings["buffers"].append("%s-search" % (i,))
  timelines = buffers.emptyPanel(self.nb)
  self.nb.InsertSubPage(account_index, timelines, _(u"Timelines"))
  self.db.settings["buffers"].append("timelines")
  for i in config.main["other_buffers"]["timelines"]:
   self.nb.InsertSubPage(self.db.settings["buffers"].index("timelines"), buffers.basePanel(self.nb, self, i, self.twitter.twitter.get_user_timeline, argumento=i, timeline=True, sound="tweet_timeline.ogg"), _(u"Timeline for %s") % i)
   self.db.settings["buffers"].append(i)
  lists = buffers.emptyPanel(self.nb)
  self.nb.InsertSubPage(account_index, lists, _(u"Lists"))
  self.db.settings["buffers"].append("lists")
  for i in config.main["other_buffers"]["lists"]:
   self.nb.InsertSubPage(self.db.settings["buffers"].index("lists"), buffers.listPanel(self.nb, self, i+"-list", argumento=twitter.utils.find_list(i, self.db.settings["lists"])), _(u"List for %s") % i)
   self.db.settings["buffers"].append(i+"-list")

  ## favourites timelines
  favs_timelines = buffers.emptyPanel(self.nb)
  self.nb.InsertSubPage(account_index, favs_timelines, _(U"Favourites timelines"))
  self.db.settings["buffers"].append("favourites_timelines")
  for i in config.main["other_buffers"]["favourites_timelines"]:
   self.nb.InsertSubPage(self.db.settings["buffers"].index("favourites_timelines"), buffers.favsPanel(self.nb, self, i+"favs", argumento=i, sound="favourites_timeline_updated.ogg"), _(u"Favourites for %s") % i,)
   self.db.settings["buffers"].append(i+"favs")
  self.fav_stream = RepeatingTimer(180, self.get_fav_buffers)
  self.fav_stream.start()
  for i in config.main["other_buffers"]["trending_topic_buffers"]:
   buff = buffers.trendsPanel(self.nb, self, "%s_tt" % (i,), argumento=i, sound="trends_updated.ogg")
   timer = RepeatingTimer(300, buff.start_streams)
   timer.start()
   num = buff.start_streams()
   buff.put_items(num)
   self.nb.InsertSubPage(self.db.settings["buffers"].index(self.db.settings["user_name"]), buff, _(u"Trending topics for %s") % (buff.name,))
  self.sizer.Add(self.nb, 0, wx.ALL, 5)
  if config.main["general"]["use_invisible_keyboard_shorcuts"] == True:
   km = self.create_invisible_keyboard_shorcuts()
   self.register_invisible_keyboard_shorcuts(km)
  panel.SetSizer(self.sizer)
  self.SetClientSize(self.sizer.CalcMin())
  self.Bind(event.MyEVT_STARTED, self.onInit)
  self.Bind(event.EVT_RESULT, self.onMemberAdded)
  pub.subscribe(self.listen_streamerror, "streamError")
  pub.subscribe(self.listen_for_friends, "friendsReceived")
  call_threaded(self.init, run_streams=True)

 def init(self, run_streams=False):
  """ Calls the start_stream function for each stream tab."""
  deleted = 0
  for i in range(0, self.nb.GetPageCount()):
   if self.nb.GetPage(i).type == "account" or self.nb.GetPage(i).type == "empty": continue
   if i == self.nb.GetPageCount() and deleted > 0:
    i = i-1
    deleted = deleted-1
#   log.debug(u"Starting stream for %s..." % self.nb.GetPage(i).name_buffer)
   info_event = event.infoEvent(event.EVT_STARTED, 1)
   try:
    if self.nb.GetPage(i).type == "search":
     self.nb.GetPage(i).timer = RepeatingTimer(180, self.nb.GetPage(i).load_search)
     self.nb.GetPage(i).timer.start()
    num = self.nb.GetPage(i).start_streams()
    info_event.SetItem(i, num)
    wx.PostEvent(self, info_event)
   except TwythonError as e:
    continue
   except UnicodeDecodeError: # This happens when there is a bad internet connection
    continue
  output.speak(_(u"Ready"))

  if run_streams == True:
   self.get_home()
   self.get_tls()
   self.check_streams = RepeatingTimer(config.main["general"]["time_to_check_streams"], self.check_stream_up)
   self.check_streams.start()
  # If all it's done, then play a nice sound saying that all it's OK.
  sound.player.play("ready.ogg")
  autocompletionUsersSettings.execute_at_startup(window=self)

 def remove_list(self, id):
  for i in range(0, self.nb.GetPageCount()):
   if self.nb.GetPage(i).type == "list":
    if self.nb.GetPage(i).argumento == id:
     pos = self.nb.GetCurrentPage().remove_invalid_buffer()
     if pos != None:
      self.nb.DeletePage(pos)
      self.onMemberAdded()

 def onMemberAdded(self, ev):
  self.stream2.disconnect()
  del self.stream2
  self.get_tls()

 def get_fav_buffers(self):
  for i in config.main["other_buffers"]["favourites_timelines"]:
   num = self.nb.GetPage(self.db.settings["buffers"].index(i+"favs")).start_streams()
   if num > 0: output.speak(_(u"%s favourites from %s") % (nun, i))

 def setup_twitter(self, panel):
  """ Setting up the connection for twitter, or authenticate if the config file has valid credentials."""
#  try:
  self.twitter.login(self.user_key, self.user_secret)
  self.logging_in_twblue(panel)
  log.info("Authorized in Twitter.")
  del self.user_key; del self.user_secret
#  except:
#   dlg1 = wx.MessageDialog(panel, _(u"Connection error. Try again later."), _(u"Error!"), wx.ICON_ERROR)
#   dlg1.ShowModal()
#   self.Close(True)

 def get_home(self):
  """ Gets the home stream, that manages home timeline, mentions, direct messages and sent."""
  try:
   self.stream = twitter.buffers.stream.streamer(application.app_key, application.app_secret, config.main["twitter"]["user_key"], config.main["twitter"]["user_secret"], parent=self)
   stream_threaded(self.stream.user)
  except:
   self.stream.disconnect()

 def start_lists(self):
  for i in range(0, self.nb.GetPageCount()):
   if self.nb.GetPage(i).type == "list": self.nb.GetPage(i).retrieve_ids()

 def get_tls(self):
  """ Setting the stream for individual user timelines."""
#  try:
  self.stream2 = twitter.buffers.indibidual.streamer(application.app_key, application.app_secret, config.main["twitter"]["user_key"], config.main["twitter"]["user_secret"], parent=self)
  # The self.ids contains all IDS for the follow argument of the stream.
  ids = ""
   # If we have more than 0 items on a list, then.
  for i in config.main["other_buffers"]["timelines"]:
   ids = ids+self.db.settings[i][0]["user"]["id_str"]+", "
  for i in range(0, self.nb.GetPageCount()):
   if self.nb.GetPage(i).type == "list":
    for z in self.nb.GetPage(i).users:
     ids+= str(z)+", "
  if ids != "":
 #   try:
   stream_threaded(self.stream2.statuses.filter, follow=ids)
 #   except:
 #    pass
#  except:
#   self.stream2.disconnect()

 def check_stream_up(self):
  global function_reconnect_streams_running
  if function_reconnect_streams_running == True: return
  if not hasattr(self, "stream") and not hasattr(self, "stream2"):
   function_reconnect_streams_running = True
   self.init(run_streams=True)
   return
#  try:
#   urllib2.urlopen("http://74.125.228.231", timeout=5)
#  except urllib2.URLError:
#   if self.stream.connected == True: self.stream.disconnect()
#   if hasattr(self, "stream2") and self.stream2.connected: self.stream2.disconnect()
#   if config.main["general"]["announce_stream_status"] == True: output.speak(_(u"Streams disconnected. TW Blue will try to reconnect in a minute."))
#   return
#  if self.stream.connected == False:
#   del self.stream
#   if config.main["general"]["announce_stream_status"] == True: output.speak(_(u"Reconnecting streams..."))
#   call_threaded(self.init)
#   self.get_home()
#  if hasattr(self, "stream2") and self.stream2.connected == False:
#   log.debug("Trying reconnects the timelines stream...")
#   del self.stream2
#   self.get_tls()
  function_reconnect_streams_running = False

 ### Events

 def edit_keystrokes(self, ev=None):
  if hasattr(self, "keyboard_handler"):
   dlg = keystrokeEditorGUI.keystrokeEditor(parent=self, keyboard_handler=self.keyboard_handler)
  else:
   dlg = keystrokeEditorGUI.keystrokeEditor(parent=self)
  dlg.ShowModal()
  dlg.Destroy()

 def search(self, ev=None):
  dlg = dialogs.search.searchDialog()
  if dlg.ShowModal() == wx.ID_OK:
   term = dlg.term.GetValue()
   if dlg.tweets.GetValue() == True:
    search =buffers.searchPanel(self.nb, self, "%s-search" % (term,), q=term, count=100)
    self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), search, _(u"search for %s") % (term,))
    self.db.settings["buffers"].append("%s-search" % (term,))
    config.main["other_buffers"]["tweet_searches"].append(term)
   elif dlg.users.GetValue() == True:
    search =buffers.searchUsersPanel(self.nb, self, "%s_search" % (term,), q=term, count=20)
    self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), search, _(u"search users for %s") % (term,))
    self.db.settings["buffers"].append("%s_search" % (term,))
   timer = RepeatingTimer(180, search.load_search)
   timer.start()
   num = search.start_streams()
   search.put_items(num)
  dlg.Destroy()

 def learn_sounds(self, ev):
  SoundsTutorial.gui.soundsTutorial().ShowModal()

 def view_user_lists(self, ev=None):
  userDlg = dialogs.utils.selectUserDialog(parent=self, title=_(u"Select the user"))
  if userDlg.ShowModal() == wx.ID_OK:
   user = userDlg.cb.GetValue()
  else:
   return
  dlg = dialogs.lists.userListViewer(self, user)
  dlg.ShowModal()
  userDlg.Destroy()
  dlg.Destroy()

 def add_to_list(self, ev=None):
  userDlg = dialogs.utils.selectUserDialog(parent=self, title=_(u"Select the user"))
  if userDlg.ShowModal() == wx.ID_OK:
   user = userDlg.cb.GetValue()
  else:
   return
  dlg = dialogs.lists.addUserListDialog(self)
  if dlg.ShowModal() == wx.ID_OK:
   try:
    list = self.twitter.twitter.add_list_member(list_id=self.db.settings["lists"][dlg.lista.get_selected()]["id"], screen_name=user)
    older_list = twitter.utils.find_item(self.db.settings["lists"][dlg.lista.get_selected()]["id"], self.db.settings["lists"])
    if list["mode"] == "private":
     self.db.settings["lists"].pop(older_list)
     self.db.settings["lists"].append(list)
   except TwythonError as e:
    output.speak("error %s: %s" % (e.error_code, e.msg))
  userDlg.Destroy()
  dlg.Destroy()

 def remove_from_list(self, ev=None):
  userDlg = dialogs.utils.selectUserDialog(parent=self, title=_(u"Select the user"))
  if userDlg.ShowModal() == wx.ID_OK:
   user = userDlg.cb.GetValue()
  else:
   return
  dlg = dialogs.lists.removeUserListDialog(self)
  if dlg.ShowModal() == wx.ID_OK:
   try:
    list = self.twitter.twitter.delete_list_member(list_id=self.db.settings["lists"][dlg.lista.get_selected()]["id"], screen_name=user)
    older_list = twitter.utils.find_item(self.db.settings["lists"][dlg.get_selected()]["id"], self.db.settings["lists"])
    if list["mode"] == "private":
     self.db.settings["lists"].pop(older_list)
     self.db.settings["lists"].append(list)
   except TwythonError as e:
    output.speak("error %s: %s" % (e.error_code, e.msg))
  userDlg.Destroy()
  dlg.Destroy()

 def list_manager(self, ev):
  dlg = dialogs.lists.listViewer(self)
  dlg.ShowModal()
  self.stream2.disconnect()
  del self.stream2
  self.get_tls()
  dlg.Destroy()

 def onInit(self, ev):
  if self.nb.GetPage(ev.GetItem()[0]).type != "search" or self.nb.GetPage(ev.GetItem()[0]).type != "favourites_timeline": self.nb.GetPage(ev.GetItem()[0]).put_items(ev.GetItem()[1])

 def preferences(self, ev=None):
  dlg = dialogs.configuration.configurationDialog(self)
  dlg.ShowModal()
  dlg.Destroy()

 def update_profile(self, ev=None):
  dialogs.update_profile.updateProfile(self).ShowModal()

 def onManual(self, ev):
  lang = localization.get("documentation")
  os.chdir("documentation/%s" % (lang,))
  webbrowser.open("manual.html")
  os.chdir("../../")

 def onChangelog(self, ev):
  lang = localization.get("documentation")
  os.chdir("documentation/%s" % (lang,))
  webbrowser.open("changes.html")
  os.chdir("../../")

 def onVisit_website(self, ev):
  webbrowser.open("http://twblue.com.mx")

 def onReportBug(self, ev):
  issueReporterGUI.reportBug(self.db.settings["user_name"]).ShowModal()

 def onCheckForUpdates(self, ev):
  updater.update_manager.check_for_update(msg=True)

 def details(self, ev=None):
  """ This function shows details for the selected user."""
  dlg = dialogs.utils.selectUserDialog(parent=self, title=_(u"User details"))
  if dlg.ShowModal() == wx.ID_OK:
   dialogs.show_user.showUserProfile(self.twitter, dlg.cb.GetValue()).ShowModal()
   dlg.Destroy()

 def delete(self, ev=None):
  """ Deleting a tweet or direct message."""
  if self.nb.GetCurrentPage().name_buffer != "followers" and self.nb.GetCurrentPage() != "friends" and self.nb.GetCurrentPage().name_buffer != "events":
   dlg = wx.MessageDialog(self, _(u"Do you really want to delete this message? It will be eliminated from Twitter as well."), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO)
   if dlg.ShowModal() == wx.ID_YES:
    self.nb.GetCurrentPage().destroy_status(wx.EVT_MENU)
   else:
    return

 def onPageChanged(self, ev):
  """ Announces the new title for the tab."""
  if platform.system() == "Darwin":
   output.speak(self.nb.GetPageText(self.nb.GetSelection())+",", True)

 def skip_blank_pages(self, forward=True):
  if self.nb.GetCurrentPage().type == "account" or self.nb.GetCurrentPage().type == "empty":
   self.nb.AdvanceSelection(forward)

 def close(self, ev=None):
  if config.main["general"]["ask_at_exit"] == True:
   dlg = wx.MessageDialog(self, _(u"Do you really want to close TW Blue?"), _(u"Exit"), wx.YES_NO|wx.ICON_QUESTION)
   if dlg.ShowModal() == wx.ID_YES:
    self.exit()
   dlg.Destroy()
  else:
   output.speak(_(u"Exiting..."))
   self.exit()

 def exit(self, event=None):
  config.main.write()
  log.debug("Exiting...")
  self.sysTray.RemoveIcon()
  self.sysTray.Destroy()
  try:
   self.check_streams.cancel()
  except AttributeError:
   pass
  sound.player.cleaner.cancel()
  try:
   self.stream.disconnect()
   log.debug("Stream disconnected.")
  except:
   pass
  try:
   self.stream2.disconnect()
   log.debug(u"Timelines stream disconnected.")
  except:
   pass
  wx.GetApp().ExitMainLoop()

 def onFollow(self, ev=None):
  """ Opens the follow dialog."""
  dialogs.follow.follow(self.nb.GetCurrentPage(), "follow").ShowModal()

 def onUnfollow(self, ev=None):
  """ Opens the unfollow dialog."""
  dialogs.follow.follow(self.nb.GetCurrentPage(), "unfollow").ShowModal()

 def onMute(self, ev=None):
  """ Opens the unfollow dialog."""
  dialogs.follow.follow(self.nb.GetCurrentPage(), "mute").ShowModal()

 def onUnmute(self, ev=None):
  """ Opens the unfollow dialog."""
  dialogs.follow.follow(self.nb.GetCurrentPage(), "unmute").ShowModal()

 def onReport(self, ev=None):
  """ Opens the report dialog, to report as spam to the specified user."""
  dialogs.follow.follow(self.nb.GetCurrentPage(), "report").ShowModal()

 def onBlock(self, ev=None):
  """ Opens the "block" dialog, to block the user that you want."""
  dialogs.follow.follow(self.nb.GetCurrentPage(), "block").ShowModal()

 def onUnblock(self, ev=None):
  """ Opens the "block" dialog, to block the user that you want."""
  dialogs.follow.follow(self.nb.GetCurrentPage(), "unblock").ShowModal()

 def action(self, ev=None):
  dialogs.follow.follow(self.nb.GetCurrentPage()).ShowModal()

 def compose(self, ev=None):
  """ Opens the new tweet dialog."""
  self.nb.GetCurrentPage().post_status(ev)

 def reply(self, ev=None):
  """ Opens the response dialog."""
  self.nb.GetCurrentPage().onResponse(ev)

 def dm(self, ev=None):
  """ Opens the DM Dialog."""
  # The direct_messages buffer has a method to post a diret messages while the other tabs does has not it. 
  if self.nb.GetCurrentPage().name_buffer == "direct_messages":
   self.nb.GetCurrentPage().onResponse(ev)
  elif self.nb.GetCurrentPage().name_buffer == "events": return
  else:
#   dialogs.message.dm(_(u"Direct message to %s ") % (self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().get_selected()]["user"]["screen_name"]), "", "", self.nb.GetCurrentPage()).ShowModal()
   self.nb.GetCurrentPage().onDm(ev)

 def retweet(self, ev=None):
  if self.nb.GetCurrentPage().name_buffer != "direct_messages" and self.nb.GetCurrentPage().name_buffer != "followers" and self.nb.GetCurrentPage().name_buffer != "friends" and self.nb.GetCurrentPage().name_buffer != "events":
   self.nb.GetCurrentPage().onRetweet(ev)

 def view(self, ev=None):
  tp = self.nb.GetCurrentPage().type
  if tp == "buffer" or tp == "timeline" or tp == "favourites_timeline" or tp == "list" or tp == "search":
   try:
    id = self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["id"]
    tweet = self.twitter.twitter.show_status(id=id)
    dialogs.message.viewTweet(tweet).ShowModal()
   except TwythonError as e:
    non_tweet = self.nb.GetCurrentPage().get_message(dialog=True)
    dialogs.message.viewNonTweet(non_tweet).ShowModal()
  else:
   non_tweet = self.nb.GetCurrentPage().get_message(dialog=True)
   dialogs.message.viewNonTweet(non_tweet).ShowModal()

 def fav(self, ev=None):
  if self.nb.GetCurrentPage().name_buffer != "direct_messages" and self.nb.GetCurrentPage().name_buffer != "followers" and self.nb.GetCurrentPage().name_buffer != "friends":
   try:
    self.twitter.twitter.create_favorite(id=self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["id"])
    sound.player.play("favourite.ogg")
   except TwythonError as e:
    output.speak(_(u"Error while adding to favourites."), True)
    sound.player.play("error.ogg")

 def unfav(self, ev=None):
  if self.nb.GetCurrentPage().name_buffer != "direct_messages" and self.nb.GetCurrentPage().name_buffer != "followers" and self.nb.GetCurrentPage().name_buffer != "friends":
   try:
    self.twitter.twitter.destroy_favorite(id=self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["id"])
   except TwythonError as e:
    output.speak(_(u"Error while removing from favourites."), True)
    sound.player.play("error.ogg")

 def open_timeline(self, ev=None):
  dlg = dialogs.utils.selectUserDialog(self, _(u"Individual timeline"))
  if dlg.ShowModal() == wx.ID_OK:
   user = twitter.utils.if_user_exists(self.twitter.twitter, dlg.cb.GetValue())
   if user == None:
    wx.MessageDialog(None, _(u"The user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal()
    dlg.Destroy()
    return
   if user not in config.main["other_buffers"]["timelines"]:
    config.main["other_buffers"]["timelines"].append(user)
   else:
    wx.MessageDialog(None, _(u"There's currently a timeline for this user. You are not able to open another"), _(u"Existing timeline"), wx.ICON_ERROR).ShowModal()
    dlg.Destroy()
    return
   sound.player.play("create_timeline.ogg")
   st = buffers.basePanel(self.nb, self, user, self.twitter.twitter.get_user_timeline, argumento=user, sound="ready.ogg", timeline=True)
   num = st.start_streams()
   self.db.settings["buffers"].append(user)
   if num == 0:
    wx.MessageDialog(None, _(u"This user has no tweets. You can't open a timeline for this user"), _(u"Error!"), wx.ICON_ERROR).ShowModal()
    self.db.settings.pop(user)
#    self.nb.DeletePage(self.db.settings["buffers"].index(user))
    self.db.settings["buffers"].remove(user)
   else:
    self.nb.InsertSubPage(self.db.settings["buffers"].index("timelines"), st, _(u"Timeline for %s") % (user))
    st.put_items(num)
    st.sound = "tweet_timeline.ogg"
   self.stream2.disconnect()
   del self.stream2
   self.get_tls()
  dlg.Destroy()

 def favs_timeline(self, ev=None):
  dlg = dialogs.utils.selectUserDialog(self, _(u"List of favourites"))
  if dlg.ShowModal() == wx.ID_OK:
   user = twitter.utils.if_user_exists(self.twitter.twitter, dlg.cb.GetValue())
   if user == None:
    wx.MessageDialog(None, _(u"The user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal()
    dlg.Destroy()
    return
   if user not in config.main["other_buffers"]["favourites_timelines"]:
    config.main["other_buffers"]["favourites_timelines"].append(user)
   else:
    wx.MessageDialog(None, _(u"There's already a list of favourites for this user. You can't create another."), _(u"Existing list"), wx.ICON_ERROR).ShowModal()
    dlg.Destroy()
    return
   sound.player.play("create_timeline.ogg")
   st = buffers.favsPanel(self.nb, self, user+"-favs", argumento=user, sound="favourites_timeline_updated.ogg")
   self.nb.InsertSubPage(self.db.settings["buffers"].index("favourites_timelines"), st, _(u"Favourites for %s") % (user))
   num = st.start_streams()
   self.db.settings["buffers"].append(user+"-favs")
   if num == 0:
    wx.MessageDialog(None, _(u"This user has no favourites. You can't create a list of favourites for this user."), _(u"Error!"), wx.ICON_ERROR).ShowModal()
    self.db.settings.pop(user+"-favs")
    self.nb.DeletePage(self.db.settings["buffers"].index(user+"-favs"))
    self.db.settings["buffers"].remove(user+"-favs")
   st.put_items(num)
  dlg.Destroy()

 def onAbout(self, ev=None):
  info = wx.AboutDialogInfo()
  info.SetName(application.name)
  info.SetVersion(application.version)
  info.SetDescription(application.description)
  info.SetCopyright(application.copyright)
  info.SetTranslators(application.translators)
#  info.SetLicence(application.licence)
  info.AddDeveloper(application.author)
  wx.AboutBox(info)

 def delete_buffer(self, ev=None):
  pos = self.nb.GetCurrentPage().remove_buffer()
  if pos != None:
   self.stream2.disconnect()
   del self.stream2
   self.nb.DeletePage(self.nb.GetSelection())
   sound.player.play("delete_timeline.ogg")
   self.get_tls()

 def delete_invalid_timeline(self):
  pos = self.nb.GetCurrentPage().remove_invalid_buffer()
  if pos != None:
   self.nb.DeletePage(self.nb.GetSelection())

 ### Hidden Window
 def left(self, event=None):
  num = self.nb.GetSelection()
  if num == 0:
   self.nb.ChangeSelection(self.nb.GetPageCount()-1)
  else:
   self.nb.SetSelection(num-1)
  while self.nb.GetCurrentPage().type == "account" or self.nb.GetCurrentPage().type == "empty": self.skip_blank_pages(False)
  try:
   msg = _(u"%s, %s of %s") % (self.nb.GetPageText(self.nb.GetSelection()), self.nb.GetCurrentPage().list.get_selected()+1, self.nb.GetCurrentPage().list.get_count())
  except:
   msg = _(u"%s. Empty") % (self.nb.GetPageText(self.nb.GetSelection()))
  output.speak(msg, 1)
  if self.showing == True:
   self.nb.GetCurrentPage().list.list.SetFocus()

 def right(self, event=None):
  num = self.nb.GetSelection()
  if num+1 == self.nb.GetPageCount():
   self.nb.SetSelection(0)
  else:
   self.nb.SetSelection(num+1)
  while self.nb.GetCurrentPage().type == "account" or self.nb.GetCurrentPage().type == "empty": self.skip_blank_pages(True)
  try:
   msg = _(u"%s, %s of %s") % (self.nb.GetPageText(self.nb.GetSelection()), self.nb.GetCurrentPage().list.get_selected()+1, self.nb.GetCurrentPage().list.get_count())
  except:
   msg = _(u"%s. Empty") % (self.nb.GetPageText(self.nb.GetSelection()))
  output.speak(msg, 1)
  if self.showing == True:
   self.nb.GetCurrentPage().list.list.SetFocus()

 def create_invisible_keyboard_shorcuts(self):
  keymap = {}
  for i in config.main["keymap"]:
   if hasattr(self, i):
    keymap[config.main["keymap"][i]] = getattr(self, i)
  return keymap

 def register_invisible_keyboard_shorcuts(self, keymap):
  self.keyboard_handler = WXKeyboardHandler(self)
  self.keyboard_handler.register_keys(keymap)

 def unregister_invisible_keyboard_shorcuts(self, keymap):
  try:
   self.keyboard_handler.unregister_keys(keymap)
   del self.keyboard_handler
  except AttributeError:
   pass

 def show_hide(self, ev=None):
  km = self.create_invisible_keyboard_shorcuts()
  if self.showing == True:
   if config.main["general"]["use_invisible_keyboard_shorcuts"] == False:
    self.register_invisible_keyboard_shorcuts(km)
   self.Hide()
   self.showing = False
  else:
   if config.main["general"]["use_invisible_keyboard_shorcuts"] == False:
    self.unregister_invisible_keyboard_shorcuts(km)
   self.Show()
   self.showing = True

 def toggle_global_mute(self, event=None):
  if config.main["sound"]["global_mute"] == False:
   config.main["sound"]["global_mute"] = True
   output.speak(_(u"Global mute on"))
  elif config.main["sound"]["global_mute"] == True:
   config.main["sound"]["global_mute"] = False
   output.speak(_(u"Global mute off"))

 def toggle_mute(self, event=None):
  buffer = self.nb.GetCurrentPage().name_buffer
  if buffer not in config.main["other_buffers"]["muted_buffers"]:
   config.main["other_buffers"]["muted_buffers"].append(buffer)
   output.speak(_(u"Buffer mute on"))
  elif buffer in config.main["other_buffers"]["muted_buffers"]:
   config.main["other_buffers"]["muted_buffers"].remove(buffer)
   output.speak(_(u"Buffer mute off"))

 def toggle_autoread(self, event=None):
  buffer = self.nb.GetCurrentPage().name_buffer
  if buffer not in config.main["other_buffers"]["autoread_buffers"]:
   config.main["other_buffers"]["autoread_buffers"].append(buffer)
   output.speak(_(u"The auto-reading of new tweets is enabled for this buffer"))
  elif buffer in config.main["other_buffers"]["autoread_buffers"]:
   config.main["other_buffers"]["autoread_buffers"].remove(buffer)
   output.speak(_(u"The auto-reading of new tweets is disabled for this buffer"))

 def repeat_item(self):
  output.speak(self.nb.GetCurrentPage().get_message(), 1)

 def copy_to_clipboard(self, event=None):
  output.Copy(self.nb.GetCurrentPage().get_message())
  output.speak(_(u"Copied"))

 def clear_list(self, event=None):
  self.nb.GetCurrentPage().interact("clear_list")

 def conversation_up(self, evt=None):
  if config.main["general"]["reverse_timelines"] == True and evt == None:
   self.conversation_down("down")
   return
  id = self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["in_reply_to_status_id_str"]
  pos = twitter.utils.find_previous_reply(id, self.db.settings["home_timeline"])
  if pos != None:
   self.nb.ChangeSelection(1)
   self.nb.GetCurrentPage().list.select_item(pos)
   msg = _(u"%s") % (self.nb.GetCurrentPage().get_message())
   output.speak(msg)

 def conversation_down(self, evt=None):
  if config.main["general"]["reverse_timelines"] == True and evt == None:
   self.conversation_up("up")
   return
  id = self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["id_str"]
#  pos = twitter.utils.find_next_reply(id, self.db.settings["home_timeline"])
  pos = twitter.utils.find_next_reply(id, self.db.settings["home_timeline"])
  if pos != None:
   self.nb.ChangeSelection(1)
   self.nb.GetCurrentPage().list.select_item(pos)
   msg = _(u"%s") % (self.nb.GetCurrentPage().get_message())
   output.speak(msg)

 def go_home(self):
  self.nb.GetCurrentPage().list.select_item(0)
  try:
   output.speak(self.nb.GetCurrentPage().get_message(), 1)
  except:
   pass

 def go_end(self):
  self.nb.GetCurrentPage().list.select_item(self.nb.GetCurrentPage().list.get_count()-1)
  try:
   output.speak(self.nb.GetCurrentPage().get_message(), 1)
  except:
   pass

 def go_page_up(self):
  if self.nb.GetCurrentPage().list.get_selected <= 20:
   index = 0
  else:
   index = self.nb.GetCurrentPage().list.get_selected() - 20
  self.nb.GetCurrentPage().list.select_item(index)
  try:
   output.speak(self.nb.GetCurrentPage().get_message(), 1)
  except:
   pass

 def go_page_down(self):
  if self.nb.GetCurrentPage().list.get_selected() >= self.nb.GetCurrentPage().list.get_count() - 20:
   index = self.nb.GetCurrentPage().list.get_count()-1
  else:
   index = self.nb.GetCurrentPage().list.get_selected() + 20
  self.nb.GetCurrentPage().list.select_item(index)
  try:
   output.speak(self.nb.GetCurrentPage().get_message(), 1)
  except:
   pass

 def volume_up(self):
  self.nb.GetCurrentPage().interact("volume_up")

 def volume_down(self):
  self.nb.GetCurrentPage().interact("volume_down")

 def url(self):
  self.nb.GetCurrentPage().interact("url")

 def audio(self):
  self.nb.GetCurrentPage().interact("audio")

 def up(self, event=None):
  pos = self.nb.GetCurrentPage().list.get_selected()
  index = self.nb.GetCurrentPage().list.get_selected()-1
  try:
   self.nb.GetCurrentPage().list.select_item(index)
  except:
   pass
  if pos == self.nb.GetCurrentPage().list.get_selected():
   sound.player.play("limit.ogg", False)
  try:
   output.speak(self.nb.GetCurrentPage().get_message(), 1)
  except:
   pass

 def down(self, event=None):
  index = self.nb.GetCurrentPage().list.get_selected()+1
  pos = self.nb.GetCurrentPage().list.get_selected()
  try:
   self.nb.GetCurrentPage().list.select_item(index)
  except:
   pass
  if pos == self.nb.GetCurrentPage().list.get_selected():
   sound.player.play("limit.ogg", False)
  try:
   output.speak(self.nb.GetCurrentPage().get_message(), 1)
  except:
   pass

 def get_more_items(self, event=None):
  self.nb.GetCurrentPage().get_more_items()

 def search_buffer(self, buffer_type=None, name_buffer=None):
  page = None
  for i in range(0, self.nb.GetPageCount()):
   page = self.nb.GetPage(i)
   if page.type != buffer_type:
    continue
   if page.name_buffer == name_buffer:
    return page
  return page

 def switch_account(self, ev):
  switchModule.switcher(self)

 def reverse_geocode(self, event=None):
  try:
   tweet = self.nb.GetCurrentPage().get_tweet()
   if tweet["coordinates"] != None:
    x = tweet["coordinates"]["coordinates"][0]
    y = tweet["coordinates"]["coordinates"][1]
    address = geocoder.reverse_geocode(y, x)
    if event == None: output.speak(address[0].__str__().decode("utf-8"))
    else: wx.MessageDialog(self, address[0].__str__().decode("utf-8"), _(u"Address"), wx.OK).ShowModal()
   else:
    output.speak(_(u"There are no coordinates in this tweet"))
  except GeocoderError:
   output.speak(_(u"There are no results for the coordinates in this tweet"))
  except ValueError:
   output.speak(_(u"Error decoding coordinates. Try again later."))
  except KeyError:
   pass

 def view_reverse_geocode(self, event=None):
  try:
   tweet = self.nb.GetCurrentPage().get_tweet()
   if tweet["coordinates"] != None:
    x = tweet["coordinates"]["coordinates"][0]
    y = tweet["coordinates"]["coordinates"][1]
    address = geocoder.reverse_geocode(y, x)
    dialogs.message.viewNonTweet(address[0].__str__().decode("utf-8")).ShowModal()
   else:
    output.speak(_(u"There are no coordinates in this tweet"))
  except GeocoderError:
   output.speak(_(u"There are no results for the coordinates in this tweet"))
  except ValueError:
   output.speak(_(u"Error decoding coordinates. Try again later."))
  except KeyError:
   pass

 def get_trending_topics(self, event=None):
  info = self.twitter.twitter.get_available_trends()
  trendingDialog = dialogs.trending.trendingTopicsDialog(info)
  if trendingDialog.ShowModal() == wx.ID_OK:
   if trendingDialog.country.GetValue() == True:
    woeid = trendingDialog.countries[trendingDialog.location.GetStringSelection()]
   elif trendingDialog.city.GetValue() == True:
    woeid = trendingDialog.cities[trendingDialog.location.GetStringSelection()]
   buff = buffers.trendsPanel(self.nb, self, "%s_tt" % (woeid,), argumento=woeid, sound="trends_updated.ogg")
   self.nb.InsertSubPage(self.db.settings["buffers"].index(self.db.settings["user_name"]), buff, _(u"Trending topics for %s") % (trendingDialog.location.GetStringSelection(),))
   timer = RepeatingTimer(300, buff.start_streams)
   timer.start()
   num = buff.start_streams()
   config.main["other_buffers"]["trending_topic_buffers"].append(woeid)
   buff.put_items(num)

 def listen_streamerror(self):
  log.error("There is a connection error")
  if hasattr(self, "stream"):
   self.stream.disconnect()
   del self.stream
  if hasattr(self, "stream2"):
   self.stream2.disconnect()
   del self.stream2

 def listen_for_friends(self):
   self.stream2.set_friends(self.stream.friends)

### Close App
 def Destroy(self):
  self.sysTray.Destroy()
  super(mainFrame, self).Destroy()
Exemplo n.º 18
0
	def create_controls(self):
		log.debug("Creating controls for the window...")
		posts_ = buffers.empty(parent=self.window.tb, name="posts")
		self.buffers.append(posts_)
		# Translators: Name for the posts tab in the tree view.
		self.window.add_buffer(posts_.tab, _(u"Posts"))
		home = buffers.baseBuffer(parent=self.window.tb, name="home_timeline", session=self.session, composefunc="compose_new", endpoint="newsfeed", count=self.session.settings["buffers"]["count_for_wall_buffers"])
		self.buffers.append(home)
		# Translators: Newsfeed's name in the tree view.
		self.window.insert_buffer(home.tab, _(u"Home"), self.window.search("posts"))
		self.repeatedUpdate = RepeatingTimer(180, self.update_all_buffers)
		self.repeatedUpdate.start()

		self.readMarker = RepeatingTimer(120, self.mark_as_read)
		self.readMarker.start()

		feed = buffers.feedBuffer(parent=self.window.tb, name="me_feed", composefunc="compose_status", session=self.session, endpoint="get", parent_endpoint="wall", extended=1, count=self.session.settings["buffers"]["count_for_wall_buffers"])
		self.buffers.append(feed)
		# Translators: Own user's wall name in the tree view.
		self.window.insert_buffer(feed.tab, _(u"My wall"), self.window.search("posts"))
		audios = buffers.empty(parent=self.window.tb, name="audios")
		self.buffers.append(audios)
		# Translators: name for the music category in the tree view.
		self.window.add_buffer(audios.tab, _(u"Music"))

		audio = buffers.audioBuffer(parent=self.window.tb, name="me_audio", composefunc="compose_audio", session=self.session, endpoint="get", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"])
		self.buffers.append(audio)
		self.window.insert_buffer(audio.tab, _(u"My audios"), self.window.search("audios"))
		p_audio = buffers.audioBuffer(parent=self.window.tb, name="popular_audio", composefunc="compose_audio", session=self.session, endpoint="getPopular", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"])
		self.buffers.append(p_audio)
		self.window.insert_buffer(p_audio.tab, _(u"Populars"), self.window.search("audios"))
		r_audio = buffers.audioBuffer(parent=self.window.tb, name="recommended_audio", composefunc="compose_audio", session=self.session, endpoint="getRecommendations", parent_endpoint="audio", full_list=True, count=self.session.settings["buffers"]["count_for_audio_buffers"])
		self.buffers.append(r_audio)
		self.window.insert_buffer(r_audio.tab, _(u"Recommendations"), self.window.search("audios"))
		albums = buffers.empty(parent=self.window.tb, name="albums")
		self.buffers.append(albums)
		self.window.insert_buffer(albums.tab, _(u"Albums"), self.window.search("audios"))

		videos = buffers.empty(parent=self.window.tb, name="videos")
		self.buffers.append(videos)
		# Translators: name for the videos category in the tree view.
		self.window.add_buffer(videos.tab, _(u"Video"))
		my_videos = buffers.videoBuffer(parent=self.window.tb, name="me_video", composefunc="compose_video", session=self.session, endpoint="get", parent_endpoint="video", count=self.session.settings["buffers"]["count_for_video_buffers"])
		self.buffers.append(my_videos)
		self.window.insert_buffer(my_videos.tab, _(u"My videos"), self.window.search("videos"))
		video_albums = buffers.empty(parent=self.window.tb, name="video_albums")
		self.buffers.append(video_albums)
		self.window.insert_buffer(video_albums.tab, _(u"Albums"), self.window.search("videos"))

		people = buffers.empty(parent=self.window.tb, name="people")
		self.buffers.append(people)
		self.window.add_buffer(people.tab, _(u"People"))
		friends = buffers.peopleBuffer(parent=self.window.tb, name="friends_", composefunc="compose_person", session=self.session, endpoint="get", parent_endpoint="friends", count=5000, fields="uid, first_name, last_name, last_seen")
		self.buffers.append(friends)
		self.window.insert_buffer(friends.tab, _(u"Friends"), self.window.search("people"))

		requests_ = buffers.empty(parent=self.window.tb, name="requests")
		self.buffers.append(requests_)
		self.window.insert_buffer(requests_.tab, _(u"Friendship requests"), self.window.search("people"))
		incoming_requests = buffers.requestsBuffer(parent=self.window.tb, name="friend_requests", composefunc="compose_person", session=self.session, count=1000)
		self.buffers.append(incoming_requests)
		self.window.insert_buffer(incoming_requests.tab, _(u"Followers"), self.window.search("requests"))
		outgoing_requests = buffers.requestsBuffer(parent=self.window.tb, name="friend_requests_sent", composefunc="compose_person", session=self.session, count=1000, out=1)
		self.buffers.append(outgoing_requests)
		self.window.insert_buffer(outgoing_requests.tab, _(u"I follow"), self.window.search("requests"))

		chats = buffers.empty(parent=self.window.tb, name="chats")
		self.buffers.append(chats)
		self.window.add_buffer(chats.tab, _(u"Chats"))
		timelines = buffers.empty(parent=self.window.tb, name="timelines")
		self.buffers.append(timelines)
		self.window.add_buffer(timelines.tab, _(u"Timelines"))
		self.window.realize()