def main(): twist = Twister( auth_key=auth_key, listener=TwisterListener( handler_class=EventHandler, thread_count=3, ), ) twist.handler.add_event(( {'name':'callback_one', 'callback' : cbone, 'allowuser' : ('User1', 'User2'), 'hashtag' : ('#you',), 'priority' : 2, }, {'name':'callback_two', 'callback' : cbtwo, 'allowuser' : ('User3',), 'hashtag' : ('#python','#happy'), 'priority' : 1, },) ) twist.userstream( count=None, async=False, secure=True, daemon=True,)
def user_embed(self,username='******',style='normal'): if username=='nobody': username='' # to enable /nobody/large conf = cherrypy.request.app.config['swizzler'] twister = Twister(conf['rpc_url'],format_twist) result = { 'title':'@{0} - Swizzler'.format(username), 'site_root':cherrypy.request.base+cherrypy.request.script_name, 'user':twister.get_user_info(username) } result['style_{0}'.format(style)] = True return stache.render(stache.load_template('user-iframe'),result)
def search_embed(self,userprefix=''): conf = cherrypy.request.app.config['swizzler'] twister = Twister(conf['rpc_url'],format_twist) result = {'site_root':cherrypy.request.base+cherrypy.request.script_name} userprefix = userprefix.strip().split(' ')[0] if not userprefix.startswith('@'): userprefix = '@'+userprefix if len(userprefix)>1: result['user_prefix'] = userprefix result['users'] = twister.get_users_by_partial_name(userprefix[1:],conf['num_messages']) else: result['trending'] = format_trending(twister,3*conf['num_messages']) # no avatar = about 1/3 height :) return stache.render(stache.load_template('search'),result)
def test_twister(self): """ Very basic check to see if the twister works """ r = random.Random() numbers = [r.getrandbits(32) for i in range(624)] t = Twister() t.backtrack(numbers) for i in range(int(1e4)): self.assertEqual(t.getrandbits(32), r.getrandbits(32))
def main(args): # move to starting position rl = RobotLibrary(args.robot, joystick=False) rl.move(args.x, args.y, 0.0) # configure twister = Twister(args.robot, rci=rl._rci) twister.dof = 'Rz' # most stable, due to each wheel contributing the same twister.speed = args.vRz twister.repeats = args.numRepeats twister.duration = args.duration twister.disableVisionLoc = True # the point of this procedure is to compare vision with encoders twister.accelerationLimit = 2.0 # must prevent wheel slip # run twister.run()
class MotionRangeTwister(): def __init__(self, args): # setup control and state reader self.rl = RobotLibrary(args.robot, joystick=False) # get ball and move to starting position self.homePosition = (args.x, args.y, 0.0) self.reset() # other settings self.dof = args.dof self.v = None self.accRange = None self.setRange() # sensible defaults for v and accRange # setup twister, reuse connected RCI self.twister = Twister(args.robot, rci=self.rl._rci) self.twister.dof = self.dof self.twister.duration = 1.0 self.twister.sleep = 0.5 self.twister.repeats = args.numRepeats self.twister.disableVisionLoc = True def setRange(self): # default acceleration range and speed setpoint self.v = 0.5 step = 0.2 if (self.dof == 'Rz'): self.v = 2.0 step = 0.5 self.accRange = [step * n for n in range(6,20)] # bh_verification self.accRange = [step*2 * n for n in range(10,20)] # motion_verification def reset(self): self.rl.move(*self.homePosition) def info(self, msg): # write to RDL eventlog os.system('frun diagnostics sendEvent INFO "' + msg + '"') # write to stdout print(msg, end='') sys.stdout.flush() # TODO remove, can use print() argument flush=True when migrating to python3 def run(self): # run for a in self.accRange: self.reset() isRz = (self.dof == 'Rz') self.info("testing {0} a={1:.2f}{2}2 at v={3:.2f}{2}...".format(self.dof, a, ['m/s', 'rad/s'][isRz], self.v)) self.twister.speed = self.v self.twister.accelerationLimit = a self.twister.run()
def user(self,username='******'): if username=='nobody': raise cherrypy.HTTPRedirect('/') # promoted posts are nobody's profile conf = cherrypy.request.app.config['swizzler'] twister = Twister(conf['rpc_url'],format_twist) user = twister.get_user_info(username) messages = twister.get_user_posts(username,conf['num_messages']) result = { 'is_user':True, 'title':u"{fullname} (@{username}): Profile - Swizzler".format(**user), 'subject':user, 'messages':messages, 'any_messages':not not messages, 'local_users':twister.local_user_menu()['users'], 'info':twister.get_info(), 'site_root':cherrypy.request.base+cherrypy.request.script_name, } return stache.render(stache.load_template('standard'),result)
def __init__(self, args): # setup control and state reader self.rl = RobotLibrary(args.robot, joystick=False) # get ball and move to starting position self.homePosition = (args.x, args.y, 0.0) self.reset() # other settings self.dof = args.dof self.v = None self.accRange = None self.setRange() # sensible defaults for v and accRange # setup twister, reuse connected RCI self.twister = Twister(args.robot, rci=self.rl._rci) self.twister.dof = self.dof self.twister.duration = 1.0 self.twister.sleep = 0.5 self.twister.repeats = args.numRepeats self.twister.disableVisionLoc = True
def tag(self,tag=''): tag = tag.strip().split(' ')[0] if tag.startswith('#'): tag = tag[1:] if not tag: raise cherrypy.HTTPRedirect('/') # go home to promoted posts conf = cherrypy.request.app.config['swizzler'] twister = Twister(conf['rpc_url'],format_twist) messages = twister.get_tag_posts(tag) result = { 'is_tag':True, 'title':u"#{0} - Swizzler".format(tag), 'subject':{"fullname":tag}, 'messages':messages, 'any_messages':not not messages, 'local_users':twister.local_user_menu()['users'], 'info':twister.get_info(), 'site_root':cherrypy.request.base+cherrypy.request.script_name, } return stache.render(stache.load_template('standard'),result)
def break_twister_time(first_output, max_time=None): """ Given the first output of a MersenneTwister seeded with a timestamp, brute-forces and returns the seed. """ max_time = max_time or int(time.time()) + 100 if isinstance(first_output, int): test = lambda seed: Twister(seed).next() == first_output else: blank = b'\x00' * len(first_output) test = lambda seed: twister_encrypt(seed, blank) == first_output return next(seed for seed in range(max_time, 0, -1) if test(seed))
def main(): twist = Twister(auth_key=auth_key, listener=TwisterListener(handler_class=EventHandler, thread_count=3)) twist.handler.add_event( ( { "name": "callback_one", "callback": cbone, "allowuser": ("User1", "User2"), "hashtag": ("#you",), "priority": 2, }, { "name": "callback_two", "callback": cbtwo, "allowuser": ("User3",), "hashtag": ("#python", "#happy"), "priority": 1, }, ) ) twist.userstream(count=None, async=False, secure=True, daemon=True)
def home(self,localusername='******',mode='feed'): if localusername=='nobody': raise cherrypy.HTTPRedirect('/') # promoted posts are nobody's home conf = cherrypy.request.app.config['swizzler'] twister = Twister(conf['rpc_url'],format_twist) menu = twister.local_user_menu(localusername) if mode=='mentions': messages = twister.get_user_mentions(localusername) else: messages = twister.get_user_feed(localusername,conf['num_messages']) result = { 'is_home':True, 'is_mentions':mode=='mentions', 'is_feed':mode!='mentions', 'title':u"{fullname} (@{username}): {mode} - Swizzler".format(mode=mode=='mentions' and 'Mentions' or 'Home',**menu['active']), 'local_users':menu['users'], 'info':twister.get_info(), 'subject':menu['active'], 'messages':messages, 'any_messages':not not messages, 'site_root':cherrypy.request.base+cherrypy.request.script_name, } return stache.render(stache.load_template('standard'),result)
def index(self): conf = cherrypy.request.app.config['swizzler'] twister = Twister(conf['rpc_url'],format_twist) messages = twister.get_promoted_posts(conf['num_messages']) result = { 'is_user':True, # i.e. we want to display "bio" and not mentions/DMs/profile buttons 'is_promoted':True, # message template needs to know not to show "permalink" 'title':"Welcome to Swizzler", 'local_users':twister.local_user_menu('')['users'], # '' means: "Nobody" is active 'info':twister.get_info(), 'subject':{ # pseudo-user describing promoted posts 'fullname':'Promoted posts', 'bio':format_twist(""" Mining the twister blockchain protects the #twister-verse from attacks like http://twister.net.co/?p=236 but unlike doge, we don't have shiny coins to offer "our protectors". Instead, they enjoy occasional minutes of fame in the form of the promoted posts you see here. We #Respect their hard earned crypto-graffiti by appreciating them on coffee/spliff/soy-milk/etc. breaks, because that's how we roll yo. Start mining today, and this (𝐚𝐧𝐝 moral satisfaction) can be yours.""") }, 'messages':messages, 'any_messages':not not messages, 'site_root':cherrypy.request.base+cherrypy.request.script_name, } return stache.render(stache.load_template('standard'),result)
def twist(self,username,k): conf = cherrypy.request.app.config['swizzler'] twister = Twister(conf['rpc_url'],format_twist) twist = twister.get_twist(username,k) twist['style_large'] = True rts = twister.get_twist_rts(username,k) replies = twister.get_twist_replies(username,k) result = { 'is_twist':True, 'title':u"@{0}: {1} - Swizzler".format(username,twist['time']), 'twist':twist, 'in_reply_to':twist.get('reply') and twister.get_twist(twist['reply']['username'],twist['reply']['k']) or None, 'replies':replies, 'any_replies':not not replies, 'rts':rts, 'any_rts':not not rts, 'local_users':twister.local_user_menu()['users'], 'info':twister.get_info(), 'site_root':cherrypy.request.base+cherrypy.request.script_name, } return stache.render(stache.load_template('twist'),result)
def generate_output(bits1, bits2, verify): """Fill our rule-base with outputs from MT :param bits1: number of bits from MT output :param bits2: number of bits in MT :param ((bitarray, bitarray)) -> None verify: verify function :rtype: list[(bitarray, bitarray)] """ twister = Twister(N) iterator = iter_bits_8_bit(twister) data = [] for i in xrange(bits1): print "Generating output bit %d/%d" % (i, bits1) bitfield1 = [0] * bits1 bitfield2 = [0] * bits2 val = next(iterator) bitfield1[i] = 1 for j in val: bitfield2[j] = 1 bitfield1 = bitarray(bitfield1) bitfield2 = bitarray(bitfield2) data.append((bitfield1, bitfield2)) verify(data[len(data) - 1]) return data
def messages(self,localusername,remoteusername=None): conf = cherrypy.request.app.config['swizzler'] twister = Twister(conf['rpc_url'],format_twist) localuser = twister.get_user_info(localusername) remoteuser = remoteusername and twister.get_user_info(remoteusername) or None threads = remoteusername and twister.get_user_messages(localusername,remoteusername,conf['num_messages']) or twister.get_user_messages(localusername) result = { 'is_messages':True, 'title':u"{0} (@{1}): direct messages{2}".format( localuser['fullname'],localuser['username'], remoteuser and u" with {fullname} (@{username}) - Swizzler".format(**remoteuser) or ""), 'subject':localuser, 'remoteuser':remoteuser, 'threads':threads, 'any_threads':not not threads, 'local_users':twister.local_user_menu()['users'], 'info':twister.get_info(), 'site_root':cherrypy.request.base+cherrypy.request.script_name, } return stache.render(stache.load_template('messages'),result)
def twister_encrypt(seed, data): """ "Encrypts" data with a MersenneTwister generator seeded with the given value. Please don't pretend this is cryptography. """ return stream_encrypt(Twister(seed).stream8(), data)