ws_app.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import datetime
  2. import json
  3. import os
  4. from websocket_server import WebsocketServer
  5. from api.api_app import open_file_by_wps
  6. from config import args
  7. from tools.serve_client import server_client
  8. from tools.check import is_file_open_in_wps
  9. from tools.logger_handle import logger
  10. def ws_send(client, server, data):
  11. server.send_message(client, json.dumps(data))
  12. def on_message(client, server, data):
  13. '''
  14. data:{
  15. 'option':'download_and_open_file',
  16. 'params':{
  17. 'file_id':'********',
  18. 'is_template':0
  19. }
  20. }
  21. '''
  22. logger.info(f'reve data: {data}')
  23. try:
  24. data = json.loads(data)
  25. except Exception:
  26. return ws_send({'code':2003, 'msg':'参数错误'})
  27. if data.get('option') == 'download_and_open_file':
  28. file_id = data['params'].get('file_id')
  29. is_template = data['params'].get('is_template')
  30. # 判断是否为exe模式执行
  31. if is_template:
  32. file_info = server_client.get_template_file_info(file_id)
  33. time_str = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S')
  34. local_path = os.path.join(args['work_path'],
  35. f'{file_info["name"]}({time_str}).{file_info["nameSuffix"]}')
  36. if server_client.download_template(file_info['fileLink'], local_path):
  37. return ws_send(client, server, open_file_by_wps(local_path))
  38. else:
  39. return ws_send(client, server, {'code': 3006, 'msg': '文件不存在'})
  40. file_info = server_client.get_file_info(file_id)
  41. if not file_info:
  42. return ws_send(client, server, {'code': 3006, 'msg': '文件不存在'})
  43. logger.info(f'args:{args}, file_info:{file_info}')
  44. local_file = os.path.join(args['work_path'], file_info['filePath'].replace('/', '_'))
  45. # 判断本地是否存在已下载的同名文件
  46. if not os.path.exists(local_file) or not os.path.exists(local_file + '.metadata.json'):
  47. server_client.download_file(file_info, args['work_path'])
  48. return ws_send(client, server, open_file_by_wps(local_file))
  49. # 判断本地文件是否被打开
  50. if is_file_open_in_wps(local_file):
  51. return ws_send(client, server, {'code': 1000, 'msg': '检测到文件已被打开'})
  52. # 判断本地文件和线上文件是否一致
  53. local_file_metadata = server_client.load_metadata(local_file)
  54. if local_file_metadata['update_time'] == file_info['updateTime']:
  55. return ws_send(client, server, open_file_by_wps(local_file))
  56. if local_file_metadata['md5'] == server_client.get_file_md5(local_file):
  57. server_client.download_file(file_info, args['work_path'])
  58. return ws_send(client, server, open_file_by_wps(local_file))
  59. return ws_send(client, server, {'code': 2002, 'msg': '检测到远程文件已经更新本地文件也发生改动,终止操作'})
  60. def start_ws_server():
  61. ws_server = WebsocketServer(host='0.0.0.0', port=5856)
  62. ws_server.set_fn_message_received(on_message)
  63. from tools.logger_handle import logger
  64. logger.info('ws server start')
  65. ws_server.run_forever()
  66. if __name__ == '__main__':
  67. start_ws_server()