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. work_path = os.path.join(args['work_path'], args['username'])
  32. if is_template:
  33. file_info = server_client.get_template_file_info(file_id)
  34. time_str = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S')
  35. local_path = os.path.join(work_path,
  36. f'{file_info["name"]}({time_str}).{file_info["nameSuffix"]}')
  37. if server_client.download_template(file_info['fileLink'], local_path):
  38. return ws_send(client, server, open_file_by_wps(local_path))
  39. else:
  40. return ws_send(client, server, {'code': 3006, 'msg': '文件不存在'})
  41. file_info = server_client.get_file_info(file_id)
  42. if not file_info:
  43. return ws_send(client, server, {'code': 3006, 'msg': '文件不存在'})
  44. logger.info(f'args:{args}, file_info:{file_info}')
  45. local_file = os.path.join(work_path, file_info['filePath'].replace('/', '_'))
  46. # 判断本地是否存在已下载的同名文件
  47. if not os.path.exists(local_file) or not os.path.exists(local_file + '.metadata.json'):
  48. server_client.download_file(file_info, work_path)
  49. return ws_send(client, server, open_file_by_wps(local_file))
  50. # 判断本地文件是否被打开
  51. if is_file_open_in_wps(local_file):
  52. return ws_send(client, server, {'code': 1000, 'msg': '检测到文件已被打开'})
  53. # 判断本地文件和线上文件是否一致
  54. local_file_metadata = server_client.load_metadata(local_file)
  55. if local_file_metadata['update_time'] == file_info['updateTime']:
  56. return ws_send(client, server, open_file_by_wps(local_file))
  57. if local_file_metadata['md5'] == server_client.get_file_md5(local_file):
  58. server_client.download_file(file_info, args['work_path'])
  59. return ws_send(client, server, open_file_by_wps(local_file))
  60. return ws_send(client, server, {'code': 2002, 'msg': '检测到远程文件已经更新本地文件也发生改动,终止操作'})
  61. def start_ws_server():
  62. ws_server = WebsocketServer(host='0.0.0.0', port=5856)
  63. ws_server.set_fn_message_received(on_message)
  64. logger.info('ws server start')
  65. ws_server.run_forever()
  66. if __name__ == '__main__':
  67. start_ws_server()