2016-02-14 00:06:36 +01:00
# -*- coding: utf-8 -*-
2016-02-15 12:43:40 +01:00
import wx
2016-02-14 00:06:36 +01:00
import widgetUtils
import messages
2016-02-15 02:24:45 +01:00
import utils
2016-02-15 22:09:33 +01:00
import posts
2016-02-16 00:49:39 +01:00
import player
2016-03-27 08:11:52 +02:00
import output
2016-02-14 00:06:36 +01:00
from wxUI . tabs import home
from pubsub import pub
2016-02-15 02:24:45 +01:00
from sessionmanager import session
2016-02-15 12:43:40 +01:00
from mysc . thread_utils import call_threaded
2016-03-27 08:11:52 +02:00
from wxUI import commonMessages
2016-04-11 18:48:35 +02:00
from vk import upload
2016-02-14 00:06:36 +01:00
class baseBuffer ( object ) :
2016-03-22 09:10:59 +01:00
""" a basic representation of a buffer. Other buffers should be derived from this class """
2016-02-14 00:06:36 +01:00
def __init__ ( self , parent = None , name = " " , session = None , composefunc = None , * args , * * kwargs ) :
2016-03-22 09:10:59 +01:00
""" parent wx.Treebook: parent for the buffer panel,
name str : Name for saving this buffer ' s data in the local storage variable,
session sessionmanager . session . vkSession : Session for performing operations in the Vk API . This session should be logged in when this class is instanciated .
composefunc str : This function will be called for composing the result which will be put in the listCtrl . Composefunc should existss in the sessionmanager . session module .
args and kwargs will be passed to get_items ( ) """
2016-02-14 00:06:36 +01:00
super ( baseBuffer , self ) . __init__ ( )
self . args = args
self . kwargs = kwargs
self . create_tab ( parent )
2016-03-22 09:10:59 +01:00
# Add the name to the new control so we could look for it when needed.
2016-02-14 00:06:36 +01:00
self . tab . name = name
self . session = session
self . compose_function = composefunc
self . update_function = " get_page "
self . name = name
self . connect_events ( )
def create_tab ( self , parent ) :
2016-03-22 09:10:59 +01:00
""" Creates the Wx panel. """
2016-02-14 00:06:36 +01:00
self . tab = home . homeTab ( parent )
def insert ( self , item , reversed = False ) :
2016-03-22 09:10:59 +01:00
""" Add a new item to the list. Uses session.composefunc for parsing the dictionary and create a valid result for putting it in the list. """
2016-02-14 00:06:36 +01:00
item_ = getattr ( session , self . compose_function ) ( item , self . session )
self . tab . list . insert_item ( reversed , * item_ )
2016-02-24 00:49:55 +01:00
def get_items ( self , show_nextpage = False ) :
2016-03-23 18:48:30 +01:00
""" Retrieves items from the VK API. This function is called repeatedly by the main controller and users could call it implicitly as well with the update buffer option.
2016-03-22 09:10:59 +01:00
show_nextpage boolean : If it ' s true, it will try to load previous results. " " "
2016-02-24 00:49:55 +01:00
num = getattr ( self . session , " get_newsfeed " ) ( show_nextpage = show_nextpage , name = self . name , * self . args , * * self . kwargs )
if show_nextpage == False :
2016-02-14 00:06:36 +01:00
if self . tab . list . get_count ( ) > 0 and num > 0 :
print " inserting a value "
2016-03-23 09:15:52 +01:00
v = [ i for i in self . session . db [ self . name ] [ " items " ] [ : num ] ]
v . reverse ( )
[ self . insert ( i , True ) for i in v ]
2016-02-14 00:06:36 +01:00
else :
[ self . insert ( i ) for i in self . session . db [ self . name ] [ " items " ] [ : num ] ]
2016-02-24 00:49:55 +01:00
else :
if num > 0 :
[ self . insert ( i , False ) for i in self . session . db [ self . name ] [ " items " ] [ : num ] ]
2016-03-31 18:33:02 +02:00
def get_more_items ( self ) :
2016-02-24 00:49:55 +01:00
self . get_items ( show_nextpage = True )
2016-02-14 00:06:36 +01:00
def post ( self , * args , * * kwargs ) :
p = messages . post ( title = _ ( u " Write your post " ) , caption = " " , text = " " )
if p . message . get_response ( ) == widgetUtils . OK :
2016-04-11 18:48:35 +02:00
call_threaded ( self . do_last , p = p )
def do_last ( self , p ) :
msg = p . message . get_text ( ) . encode ( " utf-8 " )
privacy_opts = p . get_privacy_options ( )
attachments = " "
if hasattr ( p , " attachments " ) :
attachments = self . upload_attachments ( p . attachments )
urls = utils . find_urls_in_text ( msg )
if len ( urls ) != 0 :
if len ( attachments ) == 0 : attachments = urls [ 0 ]
else : attachments + = urls [ 0 ]
msg = msg . replace ( urls [ 0 ] , " " )
self . session . post_wall_status ( message = msg , friends_only = privacy_opts , attachments = attachments )
pub . sendMessage ( " posted " , buffer = self . name )
2016-02-23 12:48:05 +01:00
p . message . Destroy ( )
2016-02-14 00:06:36 +01:00
2016-04-11 18:48:35 +02:00
def upload_attachments ( self , attachments ) :
# To do: Check the caption and description fields for this kind of attachments.
local_attachments = " "
uploader = upload . VkUpload ( self . session . vk . client )
for i in attachments :
if i [ " type " ] == " photo " :
photos = i [ " file " ]
description = i [ " description " ]
r = uploader . photo_wall ( photos , caption = description )
id = r [ 0 ] [ " id " ]
owner_id = r [ 0 ] [ " owner_id " ]
# self.session.vk.client.photos.edit(photo_id=id, owner_id=owner_id, caption=description)
local_attachments + = " photo {0} _ {1} , " . format ( owner_id , id )
return local_attachments
2016-02-14 00:06:36 +01:00
def connect_events ( self ) :
widgetUtils . connect_event ( self . tab . post , widgetUtils . BUTTON_PRESSED , self . post )
2016-02-15 12:43:40 +01:00
widgetUtils . connect_event ( self . tab . list . list , widgetUtils . KEYPRESS , self . get_event )
def get_event ( self , ev ) :
2016-02-20 00:36:19 +01:00
if ev . GetKeyCode ( ) == wx . WXK_RETURN and ev . ControlDown ( ) and ev . ShiftDown ( ) : event = " pause_audio "
2016-02-22 12:04:30 +01:00
elif ev . GetKeyCode ( ) == wx . WXK_RETURN and ev . ControlDown ( ) : event = " play_audio "
2016-02-15 22:09:33 +01:00
elif ev . GetKeyCode ( ) == wx . WXK_RETURN : event = " open_post "
2016-02-15 12:43:40 +01:00
elif ev . GetKeyCode ( ) == wx . WXK_F5 : event = " volume_down "
elif ev . GetKeyCode ( ) == wx . WXK_F6 : event = " volume_up "
else :
event = None
ev . Skip ( )
if event != None :
try :
getattr ( self , event ) ( )
2016-02-22 12:53:37 +01:00
except AttributeError :
2016-02-15 12:43:40 +01:00
pass
def volume_down ( self ) :
player . player . volume = player . player . volume - 5
def volume_up ( self ) :
player . player . volume = player . player . volume + 5
2016-02-14 00:06:36 +01:00
2016-02-16 23:32:40 +01:00
def play_audio ( self , * args , * * kwargs ) :
post = self . session . db [ self . name ] [ " items " ] [ self . tab . list . get_selected ( ) ]
if post . has_key ( " type " ) and post [ " type " ] == " audio " :
2016-03-26 16:08:41 +01:00
pub . sendMessage ( " play-audio " , audio_object = post [ " audio " ] [ " items " ] [ 0 ] )
2016-02-16 23:32:40 +01:00
2016-02-18 00:37:57 +01:00
def open_post ( self ) :
post = self . session . db [ self . name ] [ " items " ] [ self . tab . list . get_selected ( ) ]
if post . has_key ( " type " ) and post [ " type " ] == " audio " :
2016-02-24 17:30:07 +01:00
a = posts . audio ( self . session , post [ " audio " ] [ " items " ] )
2016-02-18 00:37:57 +01:00
a . dialog . get_response ( )
2016-02-23 12:48:05 +01:00
a . dialog . Destroy ( )
2016-02-18 00:37:57 +01:00
elif post . has_key ( " type " ) and post [ " type " ] == " friend " :
pub . sendMessage ( " open-post " , post_object = post , controller_ = " friendship " )
else :
pub . sendMessage ( " open-post " , post_object = post , controller_ = " postController " )
2016-02-20 00:36:19 +01:00
def pause_audio ( self , * args , * * kwargs ) :
player . player . pause ( )
2016-03-27 08:11:52 +02:00
def remove_buffer ( self ) : return False
2016-04-12 22:36:30 +02:00
def get_users ( self ) :
post = self . session . db [ self . name ] [ " items " ] [ self . tab . list . get_selected ( ) ]
if post . has_key ( " type " ) == False :
return post [ " from_id " ]
else :
return [ post [ " source_id " ] ]
2016-02-14 00:06:36 +01:00
class feedBuffer ( baseBuffer ) :
2016-02-24 00:49:55 +01:00
def get_items ( self , show_nextpage = False ) :
num = getattr ( self . session , " get_page " ) ( show_nextpage = show_nextpage , name = self . name , * self . args , * * self . kwargs )
2016-02-14 00:06:36 +01:00
print num
2016-02-24 00:49:55 +01:00
if show_nextpage == False :
2016-02-14 00:06:36 +01:00
if self . tab . list . get_count ( ) > 0 and num > 0 :
print " inserting a value "
2016-03-23 09:15:52 +01:00
v = [ i for i in self . session . db [ self . name ] [ " items " ] [ : num ] ]
v . reverse ( )
[ self . insert ( i , True ) for i in v ]
2016-02-14 00:06:36 +01:00
else :
[ self . insert ( i ) for i in self . session . db [ self . name ] [ " items " ] [ : num ] ]
class audioBuffer ( feedBuffer ) :
def create_tab ( self , parent ) :
self . tab = home . audioTab ( parent )
2016-02-15 09:15:38 +01:00
def connect_events ( self ) :
widgetUtils . connect_event ( self . tab . play , widgetUtils . BUTTON_PRESSED , self . play_audio )
2016-03-23 15:17:45 +01:00
widgetUtils . connect_event ( self . tab . play_all , widgetUtils . BUTTON_PRESSED , self . play_all )
2016-02-15 12:43:40 +01:00
super ( audioBuffer , self ) . connect_events ( )
2016-02-15 09:15:38 +01:00
def play_audio ( self , * args , * * kwargs ) :
selected = self . tab . list . get_selected ( )
2016-03-26 16:08:41 +01:00
pub . sendMessage ( " play-audio " , audio_object = self . session . db [ self . name ] [ " items " ] [ selected ] )
2016-02-15 09:15:38 +01:00
2016-02-15 22:09:33 +01:00
def open_post ( self ) :
selected = self . tab . list . get_selected ( )
2016-02-24 17:30:07 +01:00
audios = [ self . session . db [ self . name ] [ " items " ] [ selected ] ]
a = posts . audio ( self . session , audios )
2016-02-15 22:09:33 +01:00
a . dialog . get_response ( )
2016-02-23 12:48:05 +01:00
a . dialog . Destroy ( )
2016-03-22 09:10:59 +01:00
2016-03-23 15:17:45 +01:00
def play_all ( self , * args , * * kwargs ) :
selected = self . tab . list . get_selected ( )
2016-03-23 18:36:07 +01:00
if selected == - 1 :
selected = 0
2016-03-26 16:08:41 +01:00
audios = [ i for i in self . session . db [ self . name ] [ " items " ] [ selected : ] ]
2016-03-23 15:57:16 +01:00
pub . sendMessage ( " play-audios " , audios = audios )
2016-03-27 08:11:52 +02:00
def remove_buffer ( self ) :
if " me_audio " == self . name or " popular_audio " == self . name or " recommended_audio " == self . name :
output . speak ( _ ( u " This buffer can ' t be deleted " ) )
return False
else :
dlg = commonMessages . remove_buffer ( )
if dlg == widgetUtils . YES :
self . session . db . pop ( self . name )
return True
else :
return False
2016-03-31 18:33:02 +02:00
def get_more_items ( self , * args , * * kwargs ) :
output . speak ( _ ( u " This buffer doesn ' t support getting more items. " ) )
2016-03-23 15:57:16 +01:00
class empty ( object ) :
def __init__ ( self , name = None , parent = None , * args , * * kwargs ) :
self . tab = home . empty ( parent = parent , name = name )
self . name = name
def get_items ( self , * args , * * kwargs ) :
pass
2016-03-31 18:33:02 +02:00
def get_more_items ( self , * args , * * kwargs ) :
output . speak ( _ ( u " This buffer doesn ' t support getting more items. " ) )
2016-03-27 08:11:52 +02:00
def remove_buffer ( self ) : return False