def rand(): p = sysrandint(0, 1000000000) while True: p ^= (p << 21) & 0xffffffffffffffff p ^= (p >> 35) p ^= (p << 4) & 0xffffffffffffffff yield p
def print_banner(): """ Print animated startup banner. Style 3: Matrix-Curses - See how deep the rabbit hole goes. Copyright (c) 2012 Tom Wallroth http://github.com/devsnd/matrix-curses/ Used and modified under GNU GPL version 3 :return: None """ string = "Tinfoil Chat NaCl %s" % str_version system("clear") width, height = get_tty_wh() print((height / 2) - 1) * '\n' # Style 1 animation = sysrandint(1, 3) if animation == 1: i = 0 while i <= len(string): stdout.write("\x1b[1A" + ' ') stdout.flush() if i == len(string): print((width - len(string)) / 2) * ' ' + string[:i] else: rc = chr(randrange(32, 126)) print((width - len(string)) / 2) * ' ' + string[:i] + rc i += 1 sleep(0.03) # Style 2 if animation == 2: char_l = len(string) * [''] while True: stdout.write("\x1b[1A" + ' ') stdout.flush() st = '' for i in range(len(string)): if char_l[i] != string[i]: char_l[i] = chr(randrange(32, 126)) else: char_l[i] = string[i] st += char_l[i] print((width - len(string)) / 2) * ' ' + st sleep(0.004) if st == string: break # Style 3 if animation == 3: string = "Tinfoil Chat NaCl 0.16.1" dropping_chars = 50 random_cleanup = 80 min_speed = 3 max_speed = 7 sleep_ms = 0.005 scroll_chars = '' for a in range(32, 126): scroll_chars += chr(a) class FChar(object): list_chr = list(scroll_chars) normal_attr = curses.A_NORMAL highlight_attr = curses.A_REVERSE def __init__(self, o_width, speed_min, speed_max): self.x = 0 self.y = 0 self.speed = 1 self.char = ' ' self.offset = randint(0, self.speed) self.reset(o_width, speed_min, speed_max) self.completed = [] def reset(self, c_width, speed_min, speed_max): self.char = choice(FChar.list_chr) self.x = randint(1, c_width - 1) self.y = 0 self.speed = randint(speed_min, speed_max) self.offset = randint(0, self.speed) def get_completed(self): return self.completed def tick(self, scr, steps): win_h, win_w = scr.getmaxyx() if self.advances(steps): # If window was re-sized and char is out of bounds, reset self.out_of_bounds_reset(win_w, win_h) # Make previous char curses.A_NORMAL scr.addstr(self.y, self.x, self.char, curses.A_NORMAL) # Choose new char and draw it A_NORMAL if not out of bounds self.y += 1 if self.y == win_h / 2: indent_len = (win_w - len(string)) / 2 prepended_ind = (indent_len * ' ') final_string = prepended_ind + string + ' ' if self.x > indent_len - 1: try: self.char = final_string[self.x] self.completed.append(self.x) except IndexError: self.char = choice(FChar.list_chr) else: self.char = choice(FChar.list_chr) if not self.out_of_bounds_reset(win_w, win_h): scr.addstr(self.y, self.x, self.char, curses.A_NORMAL) def out_of_bounds_reset(self, win_w, win_h): if self.x > win_w - 2: self.reset(win_w, min_speed, max_speed) return True if self.y > win_h - 2: self.reset(win_w, min_speed, max_speed) return True return False def advances(self, steps): if steps % (self.speed + self.offset) == 0: return True return False # Use insecure but fast PRNG def rand(): p = sysrandint(0, 1000000000) while True: p ^= (p << 21) & 0xffffffffffffffff p ^= (p >> 35) p ^= (p << 4) & 0xffffffffffffffff yield p def randint(_min, _max): n = r.next() return (n % (_max - _min)) + _min def main(): steps = 0 scr = curses.initscr() scr.nodelay(1) curses.curs_set(0) curses.noecho() win_h, win_w = scr.getmaxyx() if win_w < len(string): raise KeyboardInterrupt window_animation = None lines = [] for _ in range(dropping_chars): fc = FChar(win_w, min_speed, max_speed) fc.y = randint(0, win_h - 2) lines.append(fc) scr.refresh() completion = [] delay = 0 while True: win_h, win_w = scr.getmaxyx() for line in lines: line.tick(scr, steps) completed = line.get_completed() for c in completed: if c not in completion: completion.append(c) if len(completion) >= len(string): if delay > 600: raise KeyboardInterrupt else: delay += 1 for _ in range(random_cleanup): x = randint(0, win_w - 1) y = randint(0, win_h - 1) indent_len = (win_w - len(string)) / 2 prepended_ind = (indent_len * ' ') if y == win_h / 2: if x < len(prepended_ind): scr.addstr(y, x, ' ') if x > len(prepended_ind + string): scr.addstr(y, x, ' ') else: scr.addstr(y, x, ' ') if window_animation is not None: if not window_animation.tick(scr, steps): window_animation = None scr.refresh() sleep(sleep_ms) steps += 1 try: r = rand() main() except KeyboardInterrupt: curses.endwin() curses.curs_set(1) curses.reset_shell_mode() curses.echo() system("clear") sleep(0.3) system("clear") return None