def on_room_info(self, data): # Success! Reset counter self.room_info = data self.perms = data["perms"] if "patch" not in data["perms"]: msg.log("We don't have patch permission. Setting buffers to read-only") utils.mkdir(G.PROJECT_PATH) floo_json = { "url": utils.to_room_url( { "host": self.agent.host, "owner": self.agent.owner, "port": self.agent.port, "room": self.agent.room, "secure": self.agent.secure, } ) } with open(os.path.join(G.PROJECT_PATH, ".floo"), "w") as floo_fd: floo_fd.write(json.dumps(floo_json, indent=4, sort_keys=True)) for buf_id, buf in data["bufs"].iteritems(): buf_id = int(buf_id) # json keys must be strings buf_path = utils.get_full_path(buf["path"]) new_dir = os.path.dirname(buf_path) utils.mkdir(new_dir) self.FLOO_BUFS[buf_id] = buf try: buf_fd = open(buf_path, "r") buf_buf = buf_fd.read().decode("utf-8") md5 = hashlib.md5(buf_buf.encode("utf-8")).hexdigest() if md5 == buf["md5"]: msg.debug("md5 sums match. not getting buffer") buf["buf"] = buf_buf else: raise Exception("different md5") except Exception: try: open(buf_path, "a").close() except Exception as e: msg.debug("couldn't touch file: %s becuase %s" % (buf_path, e)) self.agent.send_get_buf(buf_id) msg.debug(G.PROJECT_PATH) self.agent.on_auth()
def on_room_info(self, data): # Success! Reset counter self.room_info = data self.perms = data['perms'] if 'patch' not in data['perms']: msg.log('We don\'t have patch permission. Setting buffers to read-only') utils.mkdir(G.PROJECT_PATH) floo_json = { 'url': utils.to_room_url({ 'host': self.agent.host, 'owner': self.agent.owner, 'port': self.agent.port, 'room': self.agent.room, 'secure': self.agent.secure, }) } with open(os.path.join(G.PROJECT_PATH, '.floo'), 'w') as floo_fd: floo_fd.write(json.dumps(floo_json, indent=4, sort_keys=True)) for buf_id, buf in data['bufs'].iteritems(): buf_id = int(buf_id) # json keys must be strings buf_path = utils.get_full_path(buf['path']) new_dir = os.path.dirname(buf_path) utils.mkdir(new_dir) self.FLOO_BUFS[buf_id] = buf try: buf_fd = open(buf_path, 'r') buf_buf = buf_fd.read().decode('utf-8') md5 = hashlib.md5(buf_buf.encode('utf-8')).hexdigest() if md5 == buf['md5']: msg.debug('md5 sums match. not getting buffer') buf['buf'] = buf_buf else: raise Exception('different md5') except Exception: try: open(buf_path, "a").close() except Exception as e: msg.debug("couldn't touch file: %s becuase %s" % (buf_path, e)) self.agent.send_get_buf(buf_id) msg.debug(G.PROJECT_PATH) self.agent.on_auth()
def protocol(self, req): self.buf += req.decode('utf-8') msg.debug('buf: %s' % self.buf) while True: before, sep, after = self.buf.partition('\n') if not sep: break try: data = json.loads(before) except Exception as e: msg.error('Unable to parse json: %s' % str(e)) msg.error('Data: %s' % before) raise e name = data.get('name') if name == 'patch': # TODO: we should do this in a separate thread Listener.apply_patch(data) elif name == 'get_buf': buf_id = data['id'] listener.BUFS[buf_id] = data view = listener.get_view(buf_id) if view: Listener.update_view(data, view) else: listener.save_buf(data) elif name == 'create_buf': listener.BUFS[data['id']] = data listener.save_buf(data) elif name == 'rename_buf': new = utils.get_full_path(data['path']) old = utils.get_full_path(data['old_path']) new_dir = os.path.split(new)[0] if new_dir: utils.mkdir(new_dir) os.rename(old, new) view = listener.get_view(data['id']) if view: view.retarget(new) elif name == 'delete_buf': path = utils.get_full_path(data['path']) try: utils.rm(path) except Exception: pass listener.delete_buf(data['id']) elif name == 'room_info': # Success! Reset counter self.retries = G.MAX_RETRIES self.room_info = data G.PERMS = data['perms'] if 'patch' not in data['perms']: msg.log( 'We don\'t have patch permission. Setting buffers to read-only' ) project_json = {'folders': [{'path': G.PROJECT_PATH}]} utils.mkdir(G.PROJECT_PATH) with open(os.path.join(G.PROJECT_PATH, '.sublime-project'), 'wb') as project_fd: project_fd.write( json.dumps(project_json, indent=4, sort_keys=True).encode('utf-8')) floo_json = { 'url': utils.to_room_url({ 'host': self.host, 'owner': self.owner, 'port': self.port, 'room': self.room, 'secure': self.secure, }) } with open(os.path.join(G.PROJECT_PATH, '.floo'), 'w') as floo_fd: floo_fd.write( json.dumps(floo_json, indent=4, sort_keys=True)) for buf_id, buf in data['bufs'].items(): buf_id = int(buf_id) # json keys must be strings buf_path = utils.get_full_path(buf['path']) new_dir = os.path.dirname(buf_path) utils.mkdir(new_dir) listener.BUFS[buf_id] = buf try: buf_fd = open(buf_path, 'rb') buf_buf = buf_fd.read().decode('utf-8') md5 = hashlib.md5(buf_buf.encode('utf-8')).hexdigest() if md5 == buf['md5']: msg.debug('md5 sums match. not getting buffer') buf['buf'] = buf_buf else: msg.debug( 'md5 for %s should be %s but is %s. getting buffer' % (buf['path'], buf['md5'], md5)) raise Exception('different md5') except Exception as e: msg.debug('Error calculating md5:', e) Listener.get_buf(buf_id) self.authed = True G.CONNECTED = True msg.log('Successfully joined room %s/%s' % (self.owner, self.room)) if self.on_connect: self.on_connect(self) self.on_connect = None elif name == 'join': msg.log('%s joined the room' % data['username']) self.room_info['users'][data['user_id']] = data['username'] elif name == 'part': msg.log('%s left the room' % data['username']) try: del self.room_info['users'][data['user_id']] except Exception as e: print('Unable to delete user %s from user list' % (data)) region_key = 'floobits-highlight-%s' % (data['user_id']) for window in sublime.windows(): for view in window.views(): view.erase_regions(region_key) elif name == 'highlight': region_key = 'floobits-highlight-%s' % (data['user_id']) Listener.highlight(data['id'], region_key, data['username'], data['ranges'], data.get('ping', False)) elif name == 'error': message = 'Floobits: Error! Message: %s' % str(data.get('msg')) msg.error(message) elif name == 'disconnect': message = 'Floobits: Disconnected! Reason: %s' % str( data.get('reason')) msg.error(message) sublime.error_message(message) self.stop() elif name == 'msg': self.on_msg(data) else: msg.debug('unknown name!', name, 'data:', data) self.buf = after
def protocol(self, req): self.buf += req while True: before, sep, after = self.buf.partition('\n') if not sep: break try: data = json.loads(before) except Exception as e: print('Unable to parse json:', e) print('Data:', before) raise e name = data.get('name') if name == 'patch': # TODO: we should do this in a separate thread Listener.apply_patch(data) elif name == 'get_buf': buf_id = data['id'] listener.BUFS[buf_id] = data view = listener.get_view(buf_id) if view: Listener.update_view(data, view) else: listener.save_buf(data) elif name == 'create_buf': listener.BUFS[data['id']] = data listener.save_buf(data) elif name == 'rename_buf': new = utils.get_full_path(data['path']) old = utils.get_full_path(data['old_path']) new_dir = os.path.split(new)[0] if new_dir: utils.mkdir(new_dir) os.rename(old, new) view = listener.get_view(data['id']) if view: view.retarget(new) elif name == 'delete_buf': path = utils.get_full_path(data['path']) utils.rm(path) listener.delete_buf(data['id']) elif name == 'room_info': # Success! Reset counter self.retries = G.MAX_RETRIES self.room_info = data G.PERMS = data['perms'] if 'patch' not in data['perms']: msg.log('We don\'t have patch permission. Setting buffers to read-only') project_json = { 'folders': [ {'path': G.PROJECT_PATH} ] } utils.mkdir(G.PROJECT_PATH) with open(os.path.join(G.PROJECT_PATH, '.sublime-project'), 'w') as project_fd: project_fd.write(json.dumps(project_json, indent=4, sort_keys=True)) floo_json = { 'url': utils.to_room_url({ 'host': self.host, 'owner': self.owner, 'port': self.port, 'room': self.room, 'secure': self.secure, }) } with open(os.path.join(G.PROJECT_PATH, '.floo'), 'w') as floo_fd: floo_fd.write(json.dumps(floo_json, indent=4, sort_keys=True)) for buf_id, buf in data['bufs'].iteritems(): buf_id = int(buf_id) # json keys must be strings buf_path = utils.get_full_path(buf['path']) new_dir = os.path.dirname(buf_path) utils.mkdir(new_dir) listener.BUFS[buf_id] = buf try: buf_fd = open(buf_path, 'r') buf_buf = buf_fd.read().decode('utf-8') md5 = hashlib.md5(buf_buf.encode('utf-8')).hexdigest() if md5 == buf['md5']: msg.debug('md5 sums match. not getting buffer') buf['buf'] = buf_buf else: msg.debug('md5 for %s should be %s but is %s. getting buffer' % (buf['path'], buf['md5'], md5)) raise Exception('different md5') except Exception as e: msg.debug('Error calculating md5:', e) Listener.get_buf(buf_id) self.authed = True G.CONNECTED = True msg.log('Successfully joined room %s/%s' % (self.owner, self.room)) if self.on_connect: self.on_connect(self) self.on_connect = None elif name == 'join': msg.log('%s joined the room' % data['username']) self.room_info['users'][data['user_id']] = data['username'] elif name == 'part': msg.log('%s left the room' % data['username']) try: del self.room_info['users'][data['user_id']] except Exception as e: print('Unable to delete user %s from user list' % (data)) region_key = 'floobits-highlight-%s' % (data['user_id']) for window in sublime.windows(): for view in window.views(): view.erase_regions(region_key) elif name == 'highlight': region_key = 'floobits-highlight-%s' % (data['user_id']) Listener.highlight(data['id'], region_key, data['username'], data['ranges'], data.get('ping', False)) elif name == 'error': message = 'Floobits: Error! Message: %s' % str(data.get('msg')) msg.error(message) elif name == 'disconnect': message = 'Floobits: Disconnected! Reason: %s' % str(data.get('reason')) msg.error(message) sublime.error_message(message) self.stop() elif name == 'msg': self.on_msg(data) else: msg.error('unknown name!', name, 'data:', data) self.buf = after