"""
Colorful user's timeline stream
"""
-from multiprocessing import Process
-
import os
import os.path
import sys
from .config import *
from .consumer import *
from .interactive import *
-from .db import *
from .c_image import *
from .py3patch import *
# Global values
g = {}
-# Database
-db = RainbowDB()
-
# Lock for streams
-
StreamLock = threading.Lock()
# Commands
files = os.listdir(os.path.dirname(__file__) + '/colorset')
themes = [f.split('.')[0] for f in files if f.split('.')[-1] == 'json']
g['themes'] = themes
- db.theme_store(c['THEME'])
+ # Startup cmd
+ g['previous_cmd'] = ''
# Semaphore init
- db.semaphore_store(False, False)
+ c['lock'] = False
+ c['pause'] = False
+ # Init tweet dict and message dict
+ c['tweet_dict'] = []
+ c['message_dict'] = []
# Image on term
c['IMAGE_ON_TERM'] = args.image_on_term
+ # Dictionary of muted users key:screen name, value:name
+ g['mute_dict'] = {}
+ build_mute_dict(t)
+
+def build_mute_dict(t):
+ next_cursor = -1
+ rel = {}
+
+ while next_cursor != 0:
+ list = t.mutes.users.list(
+ screen_name=g['original_name'],
+ cursor=next_cursor,
+ skip_status=True,
+ include_entities=False,
+ )
+ for u in list['users']:
+ rel[u['screen_name'].encode('ascii', 'ignore')] = u['name'].encode('ascii', 'ignore')
+ next_cursor = list['next_cursor']
+ if(rel != g['mute_dict']):
+ g['mute_dict'] = rel
def switch():
g['stream_stop'] = True
args.track_keywords = keyword
# Start new thread
- th = threading.Thread(target=stream, args=(c['PUBLIC_DOMAIN'], args))
+ th = threading.Thread(
+ target=stream,
+ args=(
+ c['PUBLIC_DOMAIN'],
+ args))
th.daemon = True
th.start()
# Personal stream
# Kill old thread
g['stream_stop'] = True
# Start new thread
- th = threading.Thread(target=stream, args=(c['USER_DOMAIN'], args, g['original_name']))
+ th = threading.Thread(
+ target=stream,
+ args=(
+ c['USER_DOMAIN'],
+ args,
+ g['original_name']))
th.daemon = True
th.start()
printNicely('')
if args.ignore:
printNicely(red('Ignore: ' + str(args.ignore)))
printNicely('')
- except Exception:
+ except:
printNicely(red('Sorry I can\'t understand.'))
except:
printNicely(red('Sorry I can\'t understand.'))
return
- tid = db.rainbow_to_tweet_query(id)[0].tweet_id
+ tid = c['tweet_dict'][id]
t.statuses.retweet(id=tid, include_entities=False, trim_user=True)
except:
printNicely(red('Sorry I can\'t understand.'))
return
- tid = db.rainbow_to_tweet_query(id)[0].tweet_id
+ tid = c['tweet_dict'][id]
tweet = t.statuses.show(id=tid)
screen_name = tweet['user']['screen_name']
text = tweet['text']
except:
printNicely(red('Sorry I can\'t understand.'))
return
- tid = db.rainbow_to_tweet_query(id)[0].tweet_id
+ tid = c['tweet_dict'][id]
# Get display num if exist
try:
num = int(g['stuff'].split()[1])
except:
printNicely(red('Sorry I can\'t understand.'))
return
- tid = db.rainbow_to_tweet_query(id)[0].tweet_id
+ tid = c['tweet_dict'][id]
t.favorites.create(_id=tid, include_entities=False)
printNicely(green('Favorited.'))
draw(t.statuses.show(id=tid))
except:
printNicely(red('Sorry I can\'t understand.'))
return
- tid = db.rainbow_to_tweet_query(id)[0].tweet_id
+ tid = c['tweet_dict'][id]
user = t.statuses.show(id=tid)['user']['screen_name']
status = ' '.join(g['stuff'].split()[1:])
status = '@' + user + ' ' + status.decode('utf-8')
"""
t = Twitter(auth=authen())
try:
- rid = int(g['stuff'].split()[0])
+ id = int(g['stuff'].split()[0])
except:
printNicely(red('Sorry I can\'t understand.'))
return
- tid = db.rainbow_to_tweet_query(rid)[0].tweet_id
+ tid = c['tweet_dict'][id]
t.statuses.destroy(id=tid)
printNicely(green('Okay it\'s gone.'))
except:
printNicely(red('Sorry I can\'t understand.'))
return
- tid = db.rainbow_to_tweet_query(id)[0].tweet_id
+ tid = c['tweet_dict'][id]
t.favorites.destroy(_id=tid)
printNicely(green('Okay it\'s unfavorited.'))
draw(t.statuses.show(id=tid))
if target != 'image':
return
id = int(g['stuff'].split()[1])
- tid = db.rainbow_to_tweet_query(id)[0].tweet_id
+ tid = c['tweet_dict'][id]
tweet = t.statuses.show(id=tid)
media = tweet['entities']['media']
for m in media:
try:
if not g['stuff'].isdigit():
return
- tid = db.rainbow_to_tweet_query(g['stuff'])[0].tweet_id
+ tid = c['tweet_dict'][int(g['stuff'])]
tweet = t.statuses.show(id=tid)
link_ary = [
u for u in tweet['text'].split() if u.startswith('http://')]
"""
t = Twitter(auth=authen())
try:
- rid = int(g['stuff'].split()[0])
+ id = int(g['stuff'].split()[0])
except:
printNicely(red('Sorry I can\'t understand.'))
- mid = db.rainbow_to_message_query(rid)[0].message_id
+ mid = c['message_dict'][id]
t.direct_messages.destroy(id=mid)
printNicely(green('Message deleted.'))
rel = t.mutes.users.create(screen_name=screen_name[1:])
if isinstance(rel, dict):
printNicely(green(screen_name + ' is muted.'))
+ build_mute_dict(t)
else:
printNicely(red(rel))
else:
rel = t.mutes.users.destroy(screen_name=screen_name[1:])
if isinstance(rel, dict):
printNicely(green(screen_name + ' is unmuted.'))
+ build_mute_dict(t)
else:
printNicely(red(rel))
else:
"""
List muting user
"""
- t = Twitter(auth=authen())
- # Init cursor
- next_cursor = -1
- rel = {}
- # Cursor loop
- while next_cursor != 0:
- list = t.mutes.users.list(
- screen_name=g['original_name'],
- cursor=next_cursor,
- skip_status=True,
- include_entities=False,
- )
- for u in list['users']:
- rel[u['name']] = '@' + u['screen_name']
- next_cursor = list['next_cursor']
- # Print out result
+ rel = g['mute_dict']
+
printNicely('All: ' + str(len(rel)) + ' people.')
for name in rel:
- user = ' ' + cycle_color(name)
- user += color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ')
+ user = color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ')
+ user += cycle_color('@'+ name)
printNicely(user)
set_config(key, value)
# Apply theme immediately
if key == 'THEME':
- reload_theme(value)
+ c['THEME'] = reload_theme(value, c['THEME'])
g['decorated_name'] = lambda x: color_func(
c['DECORATED_NAME'])(
'[' + x + ']: ')
# Change theme
try:
# Load new theme
- reload_theme(g['stuff'])
+ c['THEME'] = reload_theme(g['stuff'], c['THEME'])
# Redefine decorated_name
g['decorated_name'] = lambda x: color_func(
c['DECORATED_NAME'])(
'stream': help_stream,
}
if g['stuff']:
- d[g['stuff'].strip()]()
+ d.get(
+ g['stuff'].strip(),
+ lambda: printNicely(red('No such command.'))
+ )()
else:
printNicely(usage)
"""
Pause stream display
"""
- db.semaphore_update_pause(True)
+ c['pause'] = True
printNicely(green('Stream is paused'))
"""
Replay stream
"""
- db.semaphore_update_pause(False)
+ c['pause'] = False
printNicely(green('Stream is running back now'))
"""
try:
save_history()
- os.system('rm -rf rainbow.db')
printNicely(green('See you next time :)'))
except:
pass
read_history()
reset()
while True:
+ # raw_input
if g['prefix']:
line = raw_input(g['decorated_name'](c['PREFIX']))
else:
- print('prefix is false')
line = raw_input()
+ # Save previous cmd in order to compare with readline buffer
+ g['previous_cmd'] = line.strip()
try:
cmd = line.split()[0]
except:
g['cmd'] = cmd
try:
# Lock the semaphore
- db.semaphore_update_lock(True)
+ c['lock'] = True
# Save cmd to global variable and call process
g['stuff'] = ' '.join(line.split()[1:])
# Process the command
process(cmd)()
# Not re-display
- if cmd in ['t', 'rt', 'rep']:
+ if cmd in ['switch', 't', 'rt', 'rep']:
g['prefix'] = False
else:
g['prefix'] = True
# Release the semaphore lock
- db.semaphore_update_lock(False)
+ c['lock'] = False
except Exception:
printNicely(red('OMG something is wrong with Twitter right now.'))
ascii_art(art_dict[domain])
# These arguments are optional:
stream_args = dict(
- timeout=args.timeout,
- block=False,
+ timeout=0.5, # To check g['stream_stop'] after each 0.5 s
+ block=not args.no_block,
heartbeat_timeout=args.heartbeat_timeout)
# Track keyword
query_args = dict()
StreamLock.acquire()
g['stream_stop'] = False
for tweet in tweet_iter:
- if(g['stream_stop'] == True):
- StreamLock.release()
- break
if tweet is None:
- pass
+ printNicely("-- None --")
elif tweet is Timeout:
- printNicely("-- Timeout --")
+ if(g['stream_stop']):
+ StreamLock.release()
+ break
elif tweet is HeartbeatTimeout:
printNicely("-- Heartbeat Timeout --")
elif tweet is Hangup:
printNicely("-- Hangup --")
- elif tweet.get('text'):
+ elif tweet.get('text') and (tweet['user']['screen_name'] not in g['mute_dict']):
draw(
t=tweet,
keyword=args.track_keywords,
fil=args.filter,
ig=args.ignore,
)
- sys.stdout.write(g['decorated_name'](c['PREFIX']) + readline.get_line_buffer())
- sys.stdout.flush()
+ # Current readline buffer
+ current_buffer = readline.get_line_buffer().strip()
+ # There is an unexpected behaviour in MacOSX readline + Python 2:
+ # after completely delete a word after typing it,
+ # somehow readline buffer still contains
+ # the 1st character of that word
+ if current_buffer and g['previous_cmd'] != current_buffer:
+ sys.stdout.write(
+ g['decorated_name'](c['PREFIX']) + current_buffer)
+ sys.stdout.flush()
+ elif not c['HIDE_PROMPT']:
+ sys.stdout.write(g['decorated_name'](c['PREFIX']))
+ sys.stdout.flush()
elif tweet.get('direct_message'):
print_message(tweet['direct_message'], check_semaphore=True)
except TwitterHTTPError:
magenta("We have maximum connection problem with twitter'stream API right now :("))
printNicely(magenta("Let's try again later."))
save_history()
- os.system('rm -rf rainbow.db')
sys.exit()
# Spawn stream thread
- th = threading.Thread(target=stream, args=(c['USER_DOMAIN'], args, g['original_name']))
+ th = threading.Thread(
+ target=stream,
+ args=(
+ c['USER_DOMAIN'],
+ args,
+ g['original_name']))
th.daemon = True
th.start()
# Start listen process