MailInputCommandRegion.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * ioGame
  3. * Copyright (C) 2021 - 2023 渔民小镇 (262610965@qq.com、luoyizhu@gmail.com) . All Rights Reserved.
  4. * # iohao.com . 渔民小镇
  5. *
  6. * This program is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU Affero General Public License as
  8. * published by the Free Software Foundation, either version 3 of the
  9. * License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Affero General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Affero General Public License
  17. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  18. */
  19. package com.iohao.mmo.client.input;
  20. import com.iohao.game.action.skeleton.protocol.wrapper.BoolValue;
  21. import com.iohao.game.action.skeleton.protocol.wrapper.ByteValueList;
  22. import com.iohao.game.action.skeleton.protocol.wrapper.StringValue;
  23. import com.iohao.game.action.skeleton.protocol.wrapper.WrapperKit;
  24. import com.iohao.game.common.kit.TimeKit;
  25. import com.iohao.game.external.client.AbstractInputCommandRegion;
  26. import com.iohao.game.external.client.kit.ScannerKit;
  27. import com.iohao.mmo.bag.ItemTypeIdConst;
  28. import com.iohao.mmo.common.provide.kit.ItemTypeNodeKit;
  29. import com.iohao.mmo.common.provide.kit.ItemNode;
  30. import com.iohao.mmo.mail.cmd.MailCmd;
  31. import com.iohao.mmo.mail.kit.InternalMailBuilder;
  32. import com.iohao.mmo.mail.proto.InternalMailMessage;
  33. import com.iohao.mmo.mail.proto.MailAttachmentMessage;
  34. import com.iohao.mmo.mail.proto.MailMessage;
  35. import com.iohao.mmo.mail.proto.MailStatusMessageEnum;
  36. import lombok.extern.slf4j.Slf4j;
  37. import java.util.ArrayList;
  38. import java.util.List;
  39. import java.util.stream.Collectors;
  40. /**
  41. * @author 渔民小镇
  42. * @date 2023-08-15
  43. */
  44. @Slf4j
  45. public class MailInputCommandRegion extends AbstractInputCommandRegion {
  46. @Override
  47. public void initInputCommand() {
  48. this.inputCommandCreate.cmd = MailCmd.cmd;
  49. this.inputCommandCreate.cmdName = "邮件";
  50. request();
  51. listen();
  52. }
  53. private void request() {
  54. ofCommand(MailCmd.listMail).callback(ByteValueList.class, result -> {
  55. var list = result.toList(MailMessage.class);
  56. log.info("查看玩家邮件列表 - 总数: {}", list.size());
  57. list.stream()
  58. .map(MailToString::new)
  59. .forEach(mailToString -> {
  60. log.info(mailToString.format, mailToString.arguments);
  61. System.out.println("-------------------------------------------------------");
  62. });
  63. }).setDescription("查看玩家邮件列表");
  64. ofCommand(MailCmd.addMail).setDescription("内部 action - 给玩家奖励一个【系统邮件】").setInputRequestData(() -> {
  65. String body = "玩家编号[%s],系统感觉你今天很弱鸡,特意送你一些物品";
  66. InternalMailBuilder internalMailBuilder = InternalMailBuilder.newSystemMailBuilder(String.format(body, userId));
  67. internalMailBuilder.addMailAttachment(ItemTypeIdConst.expId, 2)
  68. .addMailAttachment(ItemTypeIdConst.equipWeaponBook10, 1)
  69. .addMailAttachment(ItemTypeIdConst.iron10, 1);
  70. InternalMailMessage internalMailMessage = internalMailBuilder.build(userId);
  71. return WrapperKit.ofListByteValue(List.of(internalMailMessage));
  72. });
  73. ofCommand(MailCmd.deleteMail).callback(BoolValue.class, result -> {
  74. BoolValue value = result.getValue();
  75. log.info("删除{}", value.value ? "成功" : "失败");
  76. }).setDescription("删除指定邮件").setInputRequestData(() -> {
  77. ScannerKit.log(() -> log.info("输入需要删除的邮件 id"));
  78. String inputType = ScannerKit.nextLine("1");
  79. return StringValue.of(inputType);
  80. });
  81. ofCommand(MailCmd.deleteMails).callback(BoolValue.class, result -> {
  82. BoolValue value = result.getValue();
  83. log.info("删除{}", value.value ? "成功" : "失败");
  84. }).setDescription("一键删除所有已开封和过期的邮件");
  85. ofCommand(MailCmd.openMail).setDescription("领取指定未开封的邮件").setInputRequestData(() -> {
  86. ScannerKit.log(() -> log.info("输入需要领取的邮件 id"));
  87. String inputType = ScannerKit.nextLine("1");
  88. return StringValue.of(inputType);
  89. });
  90. ofCommand(MailCmd.openMails).setDescription("一键领取所有未开封的邮件");
  91. }
  92. private void listen() {
  93. listenBroadcast(MailMessage.class, result -> {
  94. MailMessage mailMessage = result.getValue();
  95. log.info("-----接收新邮件-----");
  96. MailToString mailToString = new MailToString(mailMessage);
  97. log.info(mailToString.format, mailToString.arguments);
  98. }, MailCmd.broadcastNewMail, "接收新邮件");
  99. }
  100. static class MailToString {
  101. String format;
  102. Object[] arguments;
  103. public MailToString(MailMessage mailMessage) {
  104. format = """
  105. 【邮件主题 {}】【邮件id {}】【邮件状态:{}】
  106. 【发送时间:{} --- 过期时间:{}】
  107. 【邮件正文】{}
  108. 【附件(奖励)列表】{}
  109. """;
  110. String mailAttachmentStr = mailMessage.mailAttachments
  111. .stream()
  112. .map(this::convert)
  113. .map(ItemTypeNodeKit::toString)
  114. .collect(Collectors.joining());
  115. List<Object> list = new ArrayList<>();
  116. list.add(mailMessage.subject);
  117. list.add(mailMessage.id);
  118. list.add(mailMessage.mailStatus == MailStatusMessageEnum.SEAL ? "未领取" : "已经领取");
  119. list.add(TimeKit.formatter(mailMessage.milliseconds));
  120. list.add(TimeKit.formatter(mailMessage.expiredMilliseconds));
  121. list.add(mailMessage.body);
  122. list.add(mailAttachmentStr);
  123. arguments = list.toArray();
  124. }
  125. ItemNode convert(MailAttachmentMessage attachmentMessage) {
  126. return new ItemNode(attachmentMessage.itemTypeId, attachmentMessage.quantity);
  127. }
  128. }
  129. }