mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-04-04 19:12:28 -04:00
165 lines
8.4 KiB
Python
165 lines
8.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
import widgetUtils
|
|
import arrow
|
|
import webbrowser
|
|
import output
|
|
import config
|
|
import languageHandler
|
|
import logging
|
|
from controller import messages
|
|
from sessions.twitter import compose, utils, templates
|
|
from mysc.thread_utils import call_threaded
|
|
from tweepy.errors import TweepyException
|
|
from pubsub import pub
|
|
from wxUI import commonMessageDialogs
|
|
from . import base
|
|
|
|
log = logging.getLogger("controller.buffers.twitter.dmBuffer")
|
|
|
|
class DirectMessagesBuffer(base.BaseBuffer):
|
|
|
|
def get_more_items(self):
|
|
# 50 results are allowed per API call, so let's assume max value can be 50.
|
|
# reference: https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events
|
|
if self.session.settings["general"]["max_tweets_per_call"] > 50:
|
|
count = 50
|
|
else:
|
|
count = self.session.settings["general"]["max_tweets_per_call"]
|
|
total = 0
|
|
# try to retrieve the cursor for the current buffer.
|
|
cursor = self.session.db["cursors"].get(self.name)
|
|
try:
|
|
items = getattr(self.session.twitter, self.function)(return_cursors=True, cursor=cursor, count=count, *self.args, **self.kwargs)
|
|
if type(items) == tuple:
|
|
items, cursor = items
|
|
if type(cursor) == tuple:
|
|
cursor = cursor[1]
|
|
cursors = self.session.db["cursors"]
|
|
cursors[self.name] = cursor
|
|
self.session.db["cursors"] = cursors
|
|
results = [i for i in items]
|
|
items = results
|
|
log.debug("Retrieved %d items for cursored search in function %s" % (len(items), self.function))
|
|
except TweepyException as e:
|
|
log.exception("Error %s" % (str(e)))
|
|
return
|
|
if items == None:
|
|
return
|
|
sent = []
|
|
received = []
|
|
sent_dms = self.session.db["sent_direct_messages"]
|
|
received_dms = self.session.db["direct_messages"]
|
|
for i in items:
|
|
if int(i.message_create["sender_id"]) == self.session.db["user_id"]:
|
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
|
sent_dms.insert(0, i)
|
|
sent.append(i)
|
|
else:
|
|
sent_dms.append(i)
|
|
sent.insert(0, i)
|
|
else:
|
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
|
received_dms.insert(0, i)
|
|
received.append(i)
|
|
else:
|
|
received_dms.append(i)
|
|
received.insert(0, i)
|
|
total = total+1
|
|
self.session.db["direct_messages"] = received_dms
|
|
self.session.db["sent_direct_messages"] = sent_dms
|
|
user_ids = [item.message_create["sender_id"] for item in items]
|
|
self.session.save_users(user_ids)
|
|
pub.sendMessage("more-sent-dms", data=sent, account=self.session.db["user_name"])
|
|
selected = self.buffer.list.get_selected()
|
|
if self.session.settings["general"]["reverse_timelines"] == True:
|
|
for i in received:
|
|
if int(i.message_create["sender_id"]) == self.session.db["user_id"]:
|
|
continue
|
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
|
self.buffer.list.insert_item(True, *tweet)
|
|
self.buffer.list.select_item(selected)
|
|
else:
|
|
for i in received:
|
|
if int(i.message_create["sender_id"]) == self.session.db["user_id"]:
|
|
continue
|
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
|
self.buffer.list.insert_item(True, *tweet)
|
|
output.speak(_(u"%s items retrieved") % (total), True)
|
|
|
|
def reply(self, *args, **kwargs):
|
|
tweet = self.get_right_tweet()
|
|
screen_name = self.session.get_user(tweet.message_create["sender_id"]).screen_name
|
|
message = messages.reply(session=self.session, title=_("Mention"), caption=_("Mention to %s") % (screen_name,), text="@%s " % (screen_name,), thread_mode=False, users=[screen_name,])
|
|
if message.message.ShowModal() == widgetUtils.OK:
|
|
tweet_data = message.get_tweet_data()
|
|
call_threaded(self.session.send_tweet, tweet_data)
|
|
if hasattr(message.message, "destroy"):
|
|
message.message.destroy()
|
|
|
|
def onFocus(self, *args, **kwargs):
|
|
tweet = self.get_tweet()
|
|
if self.session.settings["general"]["relative_times"] == True:
|
|
# fix this:
|
|
original_date = arrow.get(int(tweet.created_timestamp))
|
|
ts = original_date.humanize(locale=languageHandler.getLanguage())
|
|
self.buffer.list.list.SetItem(self.buffer.list.get_selected(), 2, ts)
|
|
if self.session.settings['sound']['indicate_audio'] and utils.is_audio(tweet):
|
|
self.session.sound.play("audio.ogg")
|
|
if self.session.settings['sound']['indicate_img'] and utils.is_media(tweet):
|
|
self.session.sound.play("image.ogg")
|
|
|
|
def clear_list(self):
|
|
dlg = commonMessageDialogs.clear_list()
|
|
if dlg == widgetUtils.YES:
|
|
self.session.db[self.name] = []
|
|
self.buffer.list.clear()
|
|
|
|
def auto_read(self, number_of_items):
|
|
if number_of_items == 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
|
tweet = self.session.db[self.name][-1]
|
|
else:
|
|
tweet = self.session.db[self.name][0]
|
|
output.speak(_(u"New direct message"))
|
|
output.speak(" ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)))
|
|
elif number_of_items > 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
|
output.speak(_(u"{0} new direct messages.").format(number_of_items,))
|
|
|
|
def open_in_browser(self, *args, **kwargs):
|
|
output.speak(_(u"This action is not supported in the buffer yet."))
|
|
|
|
def get_message(self):
|
|
template = self.session.settings["templates"]["dm"]
|
|
dm = self.get_right_tweet()
|
|
t = templates.render_dm(dm, template, self.session, relative_times=self.session.settings["general"]["relative_times"], offset_seconds=self.session.db["utc_offset"])
|
|
return t
|
|
|
|
class SentDirectMessagesBuffer(DirectMessagesBuffer):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(SentDirectMessagesBuffer, self).__init__(*args, **kwargs)
|
|
if ("sent_direct_messages" in self.session.db) == False:
|
|
self.session.db["sent_direct_messages"] = []
|
|
|
|
def get_more_items(self):
|
|
output.speak(_(u"Getting more items cannot be done in this buffer. Use the direct messages buffer instead."))
|
|
|
|
def start_stream(self, *args, **kwargs):
|
|
pass
|
|
|
|
def put_more_items(self, items):
|
|
if self.session.settings["general"]["reverse_timelines"] == True:
|
|
for i in items:
|
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
|
self.buffer.list.insert_item(False, *tweet)
|
|
else:
|
|
for i in items:
|
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)
|
|
self.buffer.list.insert_item(False, *tweet)
|
|
|
|
def get_message(self):
|
|
template = self.session.settings["templates"]["dm_sent"]
|
|
dm = self.get_right_tweet()
|
|
t = templates.render_dm(dm, template, self.session, relative_times=self.session.settings["general"]["relative_times"], offset_seconds=self.session.db["utc_offset"])
|
|
return t
|