def get_shape(shapes, shape=None): if shape is None: shape = common.get_input("Shape: ", shapes.keys()) shape = shape.lower() if shape not in shapes: raise common.LoginError("Shape not found") return shapes[shape]
def follow(client, penguin_id_or_name=None, dx=None, dy=None): if penguin_id_or_name is None: if client._follow: return 'Currently following "{}"'.format( client.get_penguin(client._follow[0]).name) return "Currently not following" penguin_id = client.get_penguin_id(penguin_id_or_name) if dx is None: client.follow(penguin_id) elif dy is None: raise common.LoginError("Invalid parameters") else: try: dx = int(dx) dy = int(dy) except ValueError: common.LoginError("Invalid parameters") client.follow(penguin_id, dx, dy)
def walk(clients_offsets, x, y): try: x = int(x) y = int(y) except ValueError: raise common.LoginError("Invalid parameters") @for_all def inner_walk(client, dx, dy): client.walk(x + dx, y + dy) inner_walk(clients_offsets)
def get_penguins(cpps=None, server=None, shape=None): servers = common.get_json("servers") shapes = common.get_json("shapes") try: cpps = common.get_cpps(servers, cpps) server = common.get_server(servers, cpps, server) shape = get_shape(shapes, shape) except (KeyboardInterrupt, EOFError): raise common.LoginError() logger = logging.getLogger() logger.addHandler(logging.NullHandler()) clients_offsets = [(common.get_client(servers, cpps, server, logger), int(offset["x"]), int(offset["y"])) for offset in shape["offsets"]] return cpps, server, shape, clients_offsets
def login(): remember = common.get_remember() argc = len(sys.argv) cpps = sys.argv[1] if argc > 1 else None server = sys.argv[2] if argc > 2 else None user = sys.argv[3] if argc > 3 else None cpps, server, user, password, encrypted, client = common.get_penguin( cpps, server, user, remember) try: client.connect(user, password, encrypted) except ClientError as e: if e.code == 101 or e.code == 603: common.remove_penguin(cpps, user) raise common.LoginError("Failed to connect") print "Connected!" return client
def log(client, level_name=None): if level_name is None: level_name = "all" if client.logger.level else "error" level = { "all": logging.NOTSET, "debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING, "error": logging.ERROR, "critical": logging.CRITICAL }.get(level_name) if level is None: raise common.LoginError( 'Unknown logging level "{}"'.format(level_name)) client.logger.setLevel(level) return "Logging {} messages".format(level_name)
def connect_clients(cpps, server, shape, clients_offsets, remember): clients = [client for client, dx, dy in clients_offsets] print "Logging in with {} penguin{}...".format( len(clients), "s" if len(clients) > 1 else "") if cpps == "cpr": try: import recaptcha except ImportError: raise common.LoginError( "cefpython is not installed; Please install it using the following command and try again:\npip install cefpython3" ) recaptcha.preload_tokens(len(clients)) penguins = common.get_json("penguins") not_connected = auto_login(cpps, shape, penguins, clients) if cpps in penguins else clients connected = [client for client in clients if client not in not_connected] try: manual_login(cpps, server, shape, connected, not_connected, remember) except common.LoginError: logout(clients_offsets) raise print "All connected!"