keyboard_method_handler.dart 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import 'dart:convert';
  2. import 'package:collection/collection.dart';
  3. import 'package:flutter/services.dart';
  4. import 'package:keyboard/data/repository/account_repository.dart';
  5. import 'package:keyboard/data/repository/characters_repository.dart';
  6. import 'package:keyboard/data/repository/chat_repository.dart';
  7. import 'package:keyboard/data/repository/keyboard_repository.dart';
  8. import 'package:keyboard/utils/atmob_log.dart';
  9. import '../data/api/response/chat_prologue_response.dart';
  10. import '../data/api/response/chat_super_speak_response.dart';
  11. import '../data/api/response/keyboard_list_response.dart';
  12. import '../utils/http_handler.dart';
  13. import '../utils/mmkv_util.dart';
  14. import '../utils/toast_util.dart';
  15. class KeyboardMethodHandler {
  16. final tag = "KeyboardMethodHandler";
  17. final KeyboardRepository keyboardRepository;
  18. final CharactersRepository charactersRepository;
  19. final AccountRepository accountRepository;
  20. final ChatRepository chatRepository;
  21. // 用处存储选中的键盘id
  22. static const String keyboardSelect = 'keyboard_select';
  23. bool get isLogin => accountRepository.isLogin.value;
  24. bool get isMember => accountRepository.isMember.value;
  25. late KeyboardListResponse keyboardListResponse;
  26. KeyboardMethodHandler(
  27. this.keyboardRepository,
  28. this.charactersRepository,
  29. this.accountRepository,
  30. this.chatRepository,
  31. );
  32. Future<dynamic> handleMethodCall(MethodCall call) async {
  33. switch (call.method) {
  34. case 'getKeyboardList':
  35. return _handleGetKeyboardList(call);
  36. case 'selectedKeyboard':
  37. return _handleSelectedKeyboard(call);
  38. case 'getCharacterList':
  39. return _handleGetCharacterList(call);
  40. case 'getCurrentKeyboardInfo':
  41. return _handleGetCurrentKeyboardInfo(call);
  42. case 'getPrologueList':
  43. return _handleGetPrologueList(call);
  44. case 'isLogin':
  45. return isLogin;
  46. case 'isMember':
  47. return isMember;
  48. case 'chatSuperReply':
  49. return _handleChatSuperReply(call);
  50. case 'chatSuperSpeak':
  51. return _handleChatSuperSpeak(call);
  52. case 'chatPrologue':
  53. return _handleChatPrologue(call);
  54. default:
  55. throw MissingPluginException('Not implemented: ${call.method}');
  56. }
  57. }
  58. Future<String> _handleGetKeyboardList(MethodCall call) async {
  59. String? type = call.arguments?['type'] as String?;
  60. final keyboardList = await keyboardRepository.getKeyboardList(type: type);
  61. final selectedKeyboardJson = KVUtil.getString(keyboardSelect, null);
  62. if (selectedKeyboardJson != null) {
  63. try {
  64. final Map<String, dynamic> keyboardMap = jsonDecode(
  65. selectedKeyboardJson,
  66. );
  67. final String? keyboardId = keyboardMap['id'] as String?;
  68. if (keyboardId != null) {
  69. for (var element in keyboardList.keyboardInfos) {
  70. if (element.id == keyboardId) {
  71. element.isSelect = true;
  72. break;
  73. }
  74. }
  75. }
  76. } catch (e) {
  77. AtmobLog.e(tag, "解析本地选中键盘失败: $e");
  78. }
  79. }
  80. keyboardListResponse = keyboardList;
  81. return jsonEncode(keyboardList.toJson());
  82. }
  83. Future<String> _handleSelectedKeyboard(MethodCall call) async {
  84. final String keyboardId = call.arguments['keyboardId'];
  85. if (keyboardListResponse.keyboardInfos.isEmpty) {
  86. keyboardListResponse = await keyboardRepository.getKeyboardList();
  87. }
  88. final selectedKeyboard = keyboardListResponse.keyboardInfos
  89. .firstWhereOrNull((element) => element.id == keyboardId);
  90. if (selectedKeyboard != null) {
  91. KVUtil.putString(keyboardSelect, jsonEncode(selectedKeyboard.toJson()));
  92. }
  93. return "{}";
  94. }
  95. Future<String> _handleGetCurrentKeyboardInfo(MethodCall call) async {
  96. final String? keyboardJsonStr = KVUtil.getString(keyboardSelect, null);
  97. if (keyboardJsonStr != null) {
  98. try {
  99. final jsonMap = jsonDecode(keyboardJsonStr);
  100. return jsonEncode(jsonMap);
  101. } catch (e) {
  102. AtmobLog.e(tag, "Failed to decode keyboard JSON: $e");
  103. }
  104. }
  105. return "{}";
  106. }
  107. Future<String> _handleGetCharacterList(MethodCall call) async {
  108. final String keyboardId = call.arguments['keyboardId'];
  109. final characterList = await keyboardRepository.getKeyboardCharacterList(
  110. keyboardId: keyboardId,
  111. );
  112. return jsonEncode(characterList.toJson());
  113. }
  114. // 获取开场白列表
  115. Future<String> _handleGetPrologueList(MethodCall call) async {
  116. final prologueList = await keyboardRepository.getPrologueList();
  117. return jsonEncode(prologueList.toJson());
  118. }
  119. // 超会回
  120. Future<String> _handleChatSuperReply(MethodCall call) async {
  121. final String content = call.arguments['content'];
  122. final String keyboardId = call.arguments['keyboardId'];
  123. final String characterId = call.arguments['characterId'];
  124. try {
  125. final chatSuperReplyResponse = await chatRepository.chatSuperReply(
  126. content: content,
  127. keyboardId: keyboardId,
  128. characterId: characterId,
  129. );
  130. return jsonEncode(chatSuperReplyResponse.toJson());
  131. } catch (error) {
  132. if (error is ServerErrorException) {
  133. AtmobLog.d(tag, "超会回失败: ${error.message}");
  134. ToastUtil.show(error.message);
  135. } else {
  136. AtmobLog.d(tag, "超会回失败: $error");
  137. }
  138. return '{}';
  139. }
  140. }
  141. // 超会说
  142. Future<String> _handleChatSuperSpeak(MethodCall call) async {
  143. final String content = call.arguments['content'];
  144. final String keyboardId = call.arguments['keyboardId'];
  145. final String characterId = call.arguments['characterId'];
  146. final ChatSuperSpeakResponse chatSuperSpeakResponse;
  147. try {
  148. chatSuperSpeakResponse = await chatRepository.chatSuperSpeak(
  149. content: content,
  150. keyboardId: keyboardId,
  151. characterId: characterId,
  152. );
  153. return jsonEncode(chatSuperSpeakResponse.toJson());
  154. } catch (error) {
  155. if (error is ServerErrorException) {
  156. AtmobLog.d(tag, "超会说失败: ${error.message}");
  157. ToastUtil.show(error.message);
  158. } else {
  159. AtmobLog.d(tag, "超会说失败: $error");
  160. }
  161. return '{}';
  162. }
  163. }
  164. // 开场白
  165. Future<String> _handleChatPrologue(MethodCall call) async {
  166. final String name = call.arguments['name'];
  167. final ChatPrologueResponse chatPrologueResponse;
  168. try {
  169. chatPrologueResponse = await chatRepository.chatPrologue(name: name);
  170. return jsonEncode(chatPrologueResponse.toJson());
  171. } catch (error) {
  172. if (error is ServerErrorException) {
  173. ToastUtil.show(error.message);
  174. AtmobLog.i(tag, "开场白失败: ${error.message}");
  175. } else {
  176. AtmobLog.i(tag, "开场白失败: $error");
  177. }
  178. return '{}';
  179. }
  180. }
  181. }