import datetime import json import os from websocket_server import WebsocketServer from api.api_app import open_file_by_wps from config import args from tools.serve_client import server_client from tools.check import is_file_open_in_wps from tools.logger_handle import logger def ws_send(client, server, data): server.send_message(client, json.dumps(data)) def on_message(client, server, data): ''' data:{ 'option':'download_and_open_file', 'params':{ 'file_id':'********', 'is_template':0 } } ''' logger.info(f'reve data: {data}') try: data = json.loads(data) except Exception: return ws_send({'code':2003, 'msg':'参数错误'}) if data.get('option') == 'download_and_open_file': file_id = data['params'].get('file_id') is_template = data['params'].get('is_template') # 判断是否为exe模式执行 if is_template: file_info = server_client.get_template_file_info(file_id) time_str = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S') local_path = os.path.join(args['work_path'], f'{file_info["name"]}({time_str}).{file_info["nameSuffix"]}') if server_client.download_template(file_info['fileLink'], local_path): return ws_send(client, server, open_file_by_wps(local_path)) else: return ws_send(client, server, {'code': 3006, 'msg': '文件不存在'}) file_info = server_client.get_file_info(file_id) if not file_info: return ws_send(client, server, {'code': 3006, 'msg': '文件不存在'}) logger.info(f'args:{args}, file_info:{file_info}') local_file = os.path.join(args['work_path'], file_info['filePath'].replace('/', '_')) # 判断本地是否存在已下载的同名文件 if not os.path.exists(local_file) or not os.path.exists(local_file + '.metadata.json'): server_client.download_file(file_info, args['work_path']) return ws_send(client, server, open_file_by_wps(local_file)) # 判断本地文件是否被打开 if is_file_open_in_wps(local_file): return ws_send(client, server, {'code': 1000, 'msg': '检测到文件已被打开'}) # 判断本地文件和线上文件是否一致 local_file_metadata = server_client.load_metadata(local_file) if local_file_metadata['update_time'] == file_info['updateTime']: return ws_send(client, server, open_file_by_wps(local_file)) if local_file_metadata['md5'] == server_client.get_file_md5(local_file): server_client.download_file(file_info, args['work_path']) return ws_send(client, server, open_file_by_wps(local_file)) return ws_send(client, server, {'code': 2002, 'msg': '检测到远程文件已经更新本地文件也发生改动,终止操作'}) def start_ws_server(): ws_server = WebsocketServer(host='0.0.0.0', port=5856) ws_server.set_fn_message_received(on_message) from tools.logger_handle import logger logger.info('ws server start') ws_server.run_forever() if __name__ == '__main__': start_ws_server()