├── .github └── workflows │ └── build.yml ├── .gitignore ├── .run └── ApricotBootstrap.run.xml ├── LICENSE ├── README.md ├── README_EN_US.md ├── build.gradle ├── deprecated ├── Wordle │ └── Words │ │ ├── 10.lang │ │ ├── 11.lang │ │ ├── 12.lang │ │ ├── 13.lang │ │ ├── 14.lang │ │ ├── 15.lang │ │ ├── 16.lang │ │ ├── 17.lang │ │ ├── 3.lang │ │ ├── 4.lang │ │ ├── 5.lang │ │ ├── 6.lang │ │ ├── 7.lang │ │ ├── 8.lang │ │ └── 9.lang └── hasnasu │ ├── HanasuPlugin.java │ └── handler │ ├── HanasuHandler.java │ ├── learn │ └── HanasuLearn.java │ └── model │ ├── HanasuModel.java │ ├── ana │ └── PreAnalysis.java │ └── chain │ ├── MarkovChain.java │ ├── MarkovWord.java │ ├── MarkovWordWeight.java │ └── leveldb │ └── LevelDbChainMap.java ├── doc └── zh_cn │ ├── develop │ ├── event │ │ ├── README.md │ │ └── handler │ │ │ └── README.md │ ├── packet │ │ └── README.md │ ├── plugin │ │ └── README.md │ └── working_stream │ │ ├── README.md │ │ ├── official │ │ └── README.md │ │ └── project │ │ └── codes │ │ ├── README.md │ │ └── math │ │ └── Base256.md │ ├── performance │ └── bootstrap │ │ └── bootstrap_time.md │ └── visualization │ ├── .$visualization.drawio.bkp │ ├── visualization.drawio │ └── visualization.drawio.png ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src └── main ├── java └── com │ └── github │ ├── cao │ └── awa │ │ ├── apricot │ │ ├── anntations │ │ │ ├── Auto.java │ │ │ ├── AutoHandlerFactor.java │ │ │ ├── AutoPlugin.java │ │ │ ├── Planning.java │ │ │ ├── Stable.java │ │ │ ├── Synchronized.java │ │ │ ├── Unsupported.java │ │ │ └── Warning.java │ │ ├── approval │ │ │ └── group │ │ │ │ └── ApprovalType.java │ │ ├── banner │ │ │ └── Banner.java │ │ ├── clock │ │ │ └── LowPrecisionClock.java │ │ ├── command │ │ │ └── Command.java │ │ ├── config │ │ │ ├── Configure.java │ │ │ ├── plugin │ │ │ │ └── handler │ │ │ │ │ ├── ApsConfig.java │ │ │ │ │ └── PluginConfig.java │ │ │ └── util │ │ │ │ └── ConfigUtil.java │ │ ├── database │ │ │ ├── ApricotDatabase.java │ │ │ ├── empty │ │ │ │ └── EmptyDatabase.java │ │ │ ├── message │ │ │ │ └── store │ │ │ │ │ └── MessageDatabase.java │ │ │ └── simple │ │ │ │ ├── ResourceDatabase.java │ │ │ │ ├── StringKvDatabase.java │ │ │ │ ├── StringLongDatabase.java │ │ │ │ └── serial │ │ │ │ ├── SerialKvDatabase.java │ │ │ │ └── SerialLongKvDatabase.java │ │ ├── debug │ │ │ └── monitor │ │ │ │ └── Monitor.java │ │ ├── event │ │ │ ├── handler │ │ │ │ ├── Compulsory.java │ │ │ │ ├── EventHandler.java │ │ │ │ ├── add │ │ │ │ │ ├── friend │ │ │ │ │ │ └── AddFriendEventHandler.java │ │ │ │ │ └── group │ │ │ │ │ │ ├── AddGroupEventHandler.java │ │ │ │ │ │ └── InviteGroupEventHandler.java │ │ │ │ ├── invalid │ │ │ │ │ └── InvalidDataReceivedEventHandler.java │ │ │ │ ├── lifecycle │ │ │ │ │ └── disconnect │ │ │ │ │ │ ├── ProxyConnectEventHandler.java │ │ │ │ │ │ └── ProxyDisconnectEventHandler.java │ │ │ │ ├── member │ │ │ │ │ └── change │ │ │ │ │ │ ├── GroupMemberChangedEventHandler.java │ │ │ │ │ │ ├── decrease │ │ │ │ │ │ ├── GroupMemberDecreasedEventHandler.java │ │ │ │ │ │ ├── bot │ │ │ │ │ │ │ └── BotDiedFromGroupEventHandler.java │ │ │ │ │ │ ├── kick │ │ │ │ │ │ │ └── GroupMemberKickedEventHandler.java │ │ │ │ │ │ └── leave │ │ │ │ │ │ │ └── GroupMemberLeavedEventHandler.java │ │ │ │ │ │ └── increase │ │ │ │ │ │ ├── GroupMemberIncreasedEventHandler.java │ │ │ │ │ │ ├── approve │ │ │ │ │ │ └── GroupMemberApprovedEventHandler.java │ │ │ │ │ │ └── invite │ │ │ │ │ │ └── GroupMemberInvitedEventHandler.java │ │ │ │ ├── message │ │ │ │ │ ├── MessageEventHandler.java │ │ │ │ │ ├── recall │ │ │ │ │ │ ├── MessageRecallEventHandler.java │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ └── GroupMessageRecallEventHandler.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ └── PrivateMessageRecallEventHandler.java │ │ │ │ │ ├── received │ │ │ │ │ │ ├── MessageReceivedEventHandler.java │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ ├── GroupAnonymousMessageReceivedEventHandler.java │ │ │ │ │ │ │ ├── GroupMessageReceivedEventHandler.java │ │ │ │ │ │ │ └── GroupNormalMessageReceivedEventHandler.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ ├── PrivateFriendMessageReceivedEventHandler.java │ │ │ │ │ │ │ ├── PrivateMessageReceivedEventHandler.java │ │ │ │ │ │ │ └── PrivateTemporaryMessageReceivedEventHandler.java │ │ │ │ │ └── sent │ │ │ │ │ │ ├── MessageSentEventHandler.java │ │ │ │ │ │ ├── group │ │ │ │ │ │ ├── GroupAnonymousMessageSentEventHandler.java │ │ │ │ │ │ ├── GroupMessageSentEventHandler.java │ │ │ │ │ │ └── GroupNormalMessageSentEventHandler.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ ├── PrivateFriendMessageSentEventHandler.java │ │ │ │ │ │ ├── PrivateMessageSentEventHandler.java │ │ │ │ │ │ └── PrivateTemporaryMessageSentEventHandler.java │ │ │ │ ├── mute │ │ │ │ │ ├── issue │ │ │ │ │ │ ├── IssueGroupMuteEventHandler.java │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ └── IssueGroupAllMuteEventHandler.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ └── IssueGroupPersonalMuteEventHandler.java │ │ │ │ │ └── lift │ │ │ │ │ │ ├── LiftGroupMuteEventHandler.java │ │ │ │ │ │ ├── all │ │ │ │ │ │ └── LiftGroupAllMuteEventHandler.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ └── LiftGroupPersonalMuteEventHandler.java │ │ │ │ ├── name │ │ │ │ │ ├── card │ │ │ │ │ │ └── GroupNameCardChangedReceivedEventHandler.java │ │ │ │ │ └── title │ │ │ │ │ │ └── GroupTitleChangedReceivedEventHandler.java │ │ │ │ ├── poke │ │ │ │ │ ├── GroupPokeReceivedEventHandler.java │ │ │ │ │ ├── PokeReceivedEventHandler.java │ │ │ │ │ └── PrivatePokeReceivedEventHandler.java │ │ │ │ └── response │ │ │ │ │ └── EchoResultEventHandler.java │ │ │ ├── receive │ │ │ │ ├── Event.java │ │ │ │ ├── add │ │ │ │ │ ├── friend │ │ │ │ │ │ └── AddFriendEvent.java │ │ │ │ │ └── group │ │ │ │ │ │ ├── AddGroupEvent.java │ │ │ │ │ │ └── InviteGroupEvent.java │ │ │ │ ├── invalid │ │ │ │ │ └── InvalidDataReceivedEvent.java │ │ │ │ ├── lifecycle │ │ │ │ │ ├── ProxyConnectEvent.java │ │ │ │ │ └── ProxyDisconnectEvent.java │ │ │ │ ├── member │ │ │ │ │ └── change │ │ │ │ │ │ ├── GroupMemberChangedEvent.java │ │ │ │ │ │ ├── decrease │ │ │ │ │ │ ├── GroupMemberDecreasedEvent.java │ │ │ │ │ │ ├── bot │ │ │ │ │ │ │ └── BotDiedFromGroupEvent.java │ │ │ │ │ │ ├── kick │ │ │ │ │ │ │ └── GroupMemberKickedEvent.java │ │ │ │ │ │ └── leave │ │ │ │ │ │ │ └── GroupMemberLeavedEvent.java │ │ │ │ │ │ └── increase │ │ │ │ │ │ ├── GroupMemberIncreasedEvent.java │ │ │ │ │ │ ├── approve │ │ │ │ │ │ └── GroupMemberApprovedEvent.java │ │ │ │ │ │ └── invite │ │ │ │ │ │ └── GroupMemberInvitedEvent.java │ │ │ │ ├── message │ │ │ │ │ ├── MessageEvent.java │ │ │ │ │ ├── MessageReceivedEvent.java │ │ │ │ │ ├── MessageSentEvent.java │ │ │ │ │ ├── group │ │ │ │ │ │ ├── received │ │ │ │ │ │ │ ├── GroupAnonymousMessageReceivedEvent.java │ │ │ │ │ │ │ ├── GroupMessageReceivedEvent.java │ │ │ │ │ │ │ └── GroupNormalMessageReceivedEvent.java │ │ │ │ │ │ └── sent │ │ │ │ │ │ │ ├── GroupAnonymousMessageSentEvent.java │ │ │ │ │ │ │ ├── GroupMessageSentEvent.java │ │ │ │ │ │ │ └── GroupNormalMessageSentEvent.java │ │ │ │ │ ├── personal │ │ │ │ │ │ ├── received │ │ │ │ │ │ │ ├── PrivateFriendMessageReceivedEvent.java │ │ │ │ │ │ │ ├── PrivateMessageReceivedEvent.java │ │ │ │ │ │ │ └── PrivateTemporaryMessageReceivedEvent.java │ │ │ │ │ │ └── sent │ │ │ │ │ │ │ ├── PrivateFriendMessageSentEvent.java │ │ │ │ │ │ │ ├── PrivateMessageSentEvent.java │ │ │ │ │ │ │ └── PrivateTemporaryMessageSentEvent.java │ │ │ │ │ └── recall │ │ │ │ │ │ ├── MessageRecallEvent.java │ │ │ │ │ │ ├── group │ │ │ │ │ │ └── GroupMessageRecallEvent.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ └── PrivateMessageRecallEvent.java │ │ │ │ ├── mute │ │ │ │ │ ├── issue │ │ │ │ │ │ ├── IssueGroupMuteEvent.java │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ └── IssueGroupAllMuteEvent.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ └── IssueGroupPersonalMuteEvent.java │ │ │ │ │ └── lift │ │ │ │ │ │ ├── LiftGroupMuteEvent.java │ │ │ │ │ │ ├── all │ │ │ │ │ │ └── LiftGroupAllMuteEvent.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ └── LiftGroupPersonalMuteEvent.java │ │ │ │ ├── name │ │ │ │ │ ├── card │ │ │ │ │ │ └── GroupNameCardChangedReceivedEvent.java │ │ │ │ │ └── title │ │ │ │ │ │ └── GroupTitleChangedReceivedEvent.java │ │ │ │ ├── poke │ │ │ │ │ ├── GroupPokeReceivedEvent.java │ │ │ │ │ ├── PokeReceivedEvent.java │ │ │ │ │ └── PrivatePokeReceivedEvent.java │ │ │ │ └── response │ │ │ │ │ └── EchoResultEvent.java │ │ │ └── target │ │ │ │ └── EventTarget.java │ │ ├── http │ │ │ ├── ApricotHttpUtil.java │ │ │ └── receptacle │ │ │ │ └── ResponseReceptacle.java │ │ ├── identifier │ │ │ ├── FileRandomIdentifier.java │ │ │ └── RandomIdentifier.java │ │ ├── information │ │ │ └── compressor │ │ │ │ ├── InformationCompressor.java │ │ │ │ ├── deflater │ │ │ │ └── DeflaterCompressor.java │ │ │ │ └── lz4 │ │ │ │ └── Lz4Compressor.java │ │ ├── io │ │ │ └── bytes │ │ │ │ └── reader │ │ │ │ └── BytesReader.java │ │ ├── mathematic │ │ │ ├── Mathematics.java │ │ │ ├── base │ │ │ │ └── Base256.java │ │ │ └── integer │ │ │ │ ├── IntegerReceptacle.java │ │ │ │ └── SimInt.java │ │ ├── message │ │ │ ├── Message.java │ │ │ ├── MessageType.java │ │ │ ├── assemble │ │ │ │ └── AssembledMessage.java │ │ │ ├── carve │ │ │ │ └── CarvedMessage.java │ │ │ ├── element │ │ │ │ ├── MessageElement.java │ │ │ │ ├── cq │ │ │ │ │ ├── at │ │ │ │ │ │ ├── AtMessageElement.java │ │ │ │ │ │ └── target │ │ │ │ │ │ │ ├── AtTarget.java │ │ │ │ │ │ │ └── AtTargetType.java │ │ │ │ │ ├── face │ │ │ │ │ │ └── FaceMessageElement.java │ │ │ │ │ ├── factor │ │ │ │ │ │ ├── CqDeserializer.java │ │ │ │ │ │ ├── CqFactor.java │ │ │ │ │ │ ├── at │ │ │ │ │ │ │ └── CqAtFactor.java │ │ │ │ │ │ ├── face │ │ │ │ │ │ │ └── CqFaceFactor.java │ │ │ │ │ │ ├── forward │ │ │ │ │ │ │ └── CqForwardFactor.java │ │ │ │ │ │ ├── image │ │ │ │ │ │ │ └── CqImageFactor.java │ │ │ │ │ │ ├── json │ │ │ │ │ │ │ └── CqJsonFactor.java │ │ │ │ │ │ ├── poke │ │ │ │ │ │ │ └── CqPokeFactor.java │ │ │ │ │ │ ├── record │ │ │ │ │ │ │ └── CqRecordFactor.java │ │ │ │ │ │ ├── replay │ │ │ │ │ │ │ └── CqReplyFactor.java │ │ │ │ │ │ ├── video │ │ │ │ │ │ │ └── CqVideoFactor.java │ │ │ │ │ │ └── xml │ │ │ │ │ │ │ └── CqXmlFactor.java │ │ │ │ │ ├── forward │ │ │ │ │ │ └── ForwardMessageElement.java │ │ │ │ │ ├── image │ │ │ │ │ │ └── ImageMessageElement.java │ │ │ │ │ ├── json │ │ │ │ │ │ └── JsonMessageElement.java │ │ │ │ │ ├── poke │ │ │ │ │ │ └── PokeMessageElement.java │ │ │ │ │ ├── record │ │ │ │ │ │ └── RecordMessageElement.java │ │ │ │ │ ├── replay │ │ │ │ │ │ └── ReplyMessageElement.java │ │ │ │ │ ├── video │ │ │ │ │ │ └── VideoMessageElement.java │ │ │ │ │ └── xml │ │ │ │ │ │ └── XmlMessageElement.java │ │ │ │ └── plain │ │ │ │ │ └── text │ │ │ │ │ └── TextMessageElement.java │ │ │ ├── forward │ │ │ │ ├── ForwardMessage.java │ │ │ │ ├── dummy │ │ │ │ │ ├── DummyForwardMessage.java │ │ │ │ │ └── node │ │ │ │ │ │ ├── DummyForwardNode.java │ │ │ │ │ │ └── DummyForwardTree.java │ │ │ │ └── real │ │ │ │ │ └── RealForwardMessage.java │ │ │ └── store │ │ │ │ └── MessageStore.java │ │ ├── network │ │ │ ├── dispenser │ │ │ │ └── ApricotUniqueDispenser.java │ │ │ ├── handler │ │ │ │ ├── ApricotBotRequestHandler.java │ │ │ │ ├── ApricotHandshakeHandler.java │ │ │ │ └── RequestHandler.java │ │ │ ├── io │ │ │ │ ├── ApricotServerNetworkIo.java │ │ │ │ └── channel │ │ │ │ │ └── ApricotServerChannelInitializer.java │ │ │ ├── lazy │ │ │ │ └── Lazy.java │ │ │ ├── packet │ │ │ │ ├── Packet.java │ │ │ │ ├── ReadonlyPacket.java │ │ │ │ ├── ResponsePacket.java │ │ │ │ ├── WritablePacket.java │ │ │ │ ├── factor │ │ │ │ │ ├── PacketDeserializer.java │ │ │ │ │ ├── PacketFactor.java │ │ │ │ │ ├── add │ │ │ │ │ │ ├── friend │ │ │ │ │ │ │ └── AddFriendReceivedPacketFactor.java │ │ │ │ │ │ └── group │ │ │ │ │ │ │ ├── AddGroupReceivedPacketFactor.java │ │ │ │ │ │ │ └── InviteGroupReceivedPacketFactor.java │ │ │ │ │ ├── invalid │ │ │ │ │ │ └── InvalidDataReceivedPacketFactor.java │ │ │ │ │ ├── member │ │ │ │ │ │ └── change │ │ │ │ │ │ │ ├── decrease │ │ │ │ │ │ │ ├── bot │ │ │ │ │ │ │ │ └── BotDiedFromGroupPacketFactor.java │ │ │ │ │ │ │ ├── kick │ │ │ │ │ │ │ │ └── GroupMemberLeavedPacketFactor.java │ │ │ │ │ │ │ └── leave │ │ │ │ │ │ │ │ └── GroupMemberKickedPacketFactor.java │ │ │ │ │ │ │ └── increase │ │ │ │ │ │ │ ├── approve │ │ │ │ │ │ │ └── GroupMemberApprovedPacketFactor.java │ │ │ │ │ │ │ └── invite │ │ │ │ │ │ │ └── GroupMemberInvitedPacketFactor.java │ │ │ │ │ ├── message │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ ├── received │ │ │ │ │ │ │ │ ├── GroupAnonymousMessagePacketFactor.java │ │ │ │ │ │ │ │ └── GroupNormalMessagePacketFactor.java │ │ │ │ │ │ │ └── sent │ │ │ │ │ │ │ │ ├── GroupAnonymousSentMessagePacketFactor.java │ │ │ │ │ │ │ │ └── GroupNormalMessageSentPacketFactor.java │ │ │ │ │ │ ├── personal │ │ │ │ │ │ │ ├── received │ │ │ │ │ │ │ │ ├── PrivateFriendMessageReceivedPacketFactor.java │ │ │ │ │ │ │ │ └── PrivateTemporaryMessageReceivedPacketFactor.java │ │ │ │ │ │ │ └── sent │ │ │ │ │ │ │ │ ├── PrivateFriendMessageSentPacketFactor.java │ │ │ │ │ │ │ │ └── PrivateTemporaryMessageSentPacketFactor.java │ │ │ │ │ │ └── recall │ │ │ │ │ │ │ ├── gruop │ │ │ │ │ │ │ └── GroupMessageRecallPacketFactor.java │ │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ └── PrivateMessageRecallPacketFactor.java │ │ │ │ │ ├── meta │ │ │ │ │ │ └── lifecycle │ │ │ │ │ │ │ ├── ProxyConnectPacketFactor.java │ │ │ │ │ │ │ └── ProxyDisconnectPacketFactor.java │ │ │ │ │ ├── mute │ │ │ │ │ │ ├── issue │ │ │ │ │ │ │ ├── IssueGroupMuteReceivedPacketFactor.java │ │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ │ └── IssueGroupAllMuteReceivedPacketFactor.java │ │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ │ └── IssueGroupPersonalMuteReceivedPacketFactor.java │ │ │ │ │ │ └── lift │ │ │ │ │ │ │ ├── LiftGroupMuteReceivedPacketFactor.java │ │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ └── LiftGroupAllMuteReceivedPacketFactor.java │ │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ └── LiftGroupPersonalMuteReceivedPacketFactor.java │ │ │ │ │ ├── name │ │ │ │ │ │ ├── card │ │ │ │ │ │ │ └── GroupNameChangedReceivedPacketFactor.java │ │ │ │ │ │ └── title │ │ │ │ │ │ │ └── GroupTitleChangedReceivedPacketFactor.java │ │ │ │ │ ├── poke │ │ │ │ │ │ └── PokeReceivedPacketFactor.java │ │ │ │ │ └── response │ │ │ │ │ │ └── EchoResultPacketFactor.java │ │ │ │ ├── receive │ │ │ │ │ ├── add │ │ │ │ │ │ ├── friend │ │ │ │ │ │ │ └── AddFriendReceivedPacket.java │ │ │ │ │ │ └── group │ │ │ │ │ │ │ ├── AddGroupReceivedPacket.java │ │ │ │ │ │ │ └── InviteGroupReceivedPacket.java │ │ │ │ │ ├── invalid │ │ │ │ │ │ └── InvalidDataReceivedPacket.java │ │ │ │ │ ├── member │ │ │ │ │ │ └── change │ │ │ │ │ │ │ ├── GroupMemberChangedPacket.java │ │ │ │ │ │ │ ├── decrease │ │ │ │ │ │ │ ├── GroupMemberDecreasedPacket.java │ │ │ │ │ │ │ ├── bot │ │ │ │ │ │ │ │ └── BotDiedFromGroupPacket.java │ │ │ │ │ │ │ ├── kick │ │ │ │ │ │ │ │ └── GroupMemberKickedPacket.java │ │ │ │ │ │ │ └── leave │ │ │ │ │ │ │ │ └── GroupMemberLeavedPacket.java │ │ │ │ │ │ │ └── increase │ │ │ │ │ │ │ ├── GroupMemberIncreasedPacket.java │ │ │ │ │ │ │ ├── approve │ │ │ │ │ │ │ └── GroupMemberApprovedPacket.java │ │ │ │ │ │ │ └── invite │ │ │ │ │ │ │ └── GroupMemberInvitedPacket.java │ │ │ │ │ ├── message │ │ │ │ │ │ ├── MessagePacket.java │ │ │ │ │ │ ├── MessageReceivedPacket.java │ │ │ │ │ │ ├── MessageSentPacket.java │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ ├── received │ │ │ │ │ │ │ │ ├── GroupAnonymousMessageReceivedPacket.java │ │ │ │ │ │ │ │ ├── GroupMessageReceivedPacket.java │ │ │ │ │ │ │ │ └── GroupNormalMessageReceivedPacket.java │ │ │ │ │ │ │ └── sent │ │ │ │ │ │ │ │ ├── GroupAnonymousMessageSentPacket.java │ │ │ │ │ │ │ │ ├── GroupMessageSentPacket.java │ │ │ │ │ │ │ │ └── GroupNormalMessageSentPacket.java │ │ │ │ │ │ ├── personal │ │ │ │ │ │ │ ├── received │ │ │ │ │ │ │ │ ├── PrivateFriendMessageReceivedPacket.java │ │ │ │ │ │ │ │ ├── PrivateMessageReceivedPacket.java │ │ │ │ │ │ │ │ └── PrivateTemporaryMessageReceivedPacket.java │ │ │ │ │ │ │ └── sent │ │ │ │ │ │ │ │ ├── PrivateFriendMessageSentPacket.java │ │ │ │ │ │ │ │ ├── PrivateMessageSentPacket.java │ │ │ │ │ │ │ │ └── PrivateTemporaryMessageSentPacket.java │ │ │ │ │ │ ├── recall │ │ │ │ │ │ │ ├── MessageRecallPacket.java │ │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ │ └── GroupMessageRecallPacket.java │ │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ │ └── PrivateMessageRecallPacket.java │ │ │ │ │ │ └── sender │ │ │ │ │ │ │ ├── BasicMessageSender.java │ │ │ │ │ │ │ ├── GroupMessageSender.java │ │ │ │ │ │ │ ├── GuildMessageSender.java │ │ │ │ │ │ │ ├── IgnoredIdMessageSender.java │ │ │ │ │ │ │ ├── MessageSender.java │ │ │ │ │ │ │ ├── PrivateMessageSender.java │ │ │ │ │ │ │ └── anonymous │ │ │ │ │ │ │ ├── Anonymous.java │ │ │ │ │ │ │ └── AnonymousMessageSender.java │ │ │ │ │ ├── meta │ │ │ │ │ │ └── lifecycle │ │ │ │ │ │ │ ├── ProxyConnectPacket.java │ │ │ │ │ │ │ └── ProxyDisconnectPacket.java │ │ │ │ │ ├── mute │ │ │ │ │ │ ├── issue │ │ │ │ │ │ │ ├── IssueGroupMuteReceivedPacket.java │ │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ │ └── IssueGroupAllMuteReceivedPacket.java │ │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ │ └── IssueGroupPersonalMuteReceivedPacket.java │ │ │ │ │ │ └── lift │ │ │ │ │ │ │ ├── LiftGroupMuteReceivedPacket.java │ │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ └── LiftGroupAllMuteReceivedPacket.java │ │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ └── LiftGroupPersonalMuteReceivedPacket.java │ │ │ │ │ ├── name │ │ │ │ │ │ ├── card │ │ │ │ │ │ │ └── GroupNameCardChangedReceivedPacket.java │ │ │ │ │ │ └── title │ │ │ │ │ │ │ └── GroupTitleChangedReceivedPacket.java │ │ │ │ │ ├── poke │ │ │ │ │ │ ├── GroupPokeReceivedPacket.java │ │ │ │ │ │ ├── PokeReceivedPacket.java │ │ │ │ │ │ └── PrivatePokeReceivedPacket.java │ │ │ │ │ └── response │ │ │ │ │ │ ├── EchoResultPacket.java │ │ │ │ │ │ ├── NoResponsePacket.java │ │ │ │ │ │ ├── forward │ │ │ │ │ │ └── GetForwardMessageResponsePacket.java │ │ │ │ │ │ └── message │ │ │ │ │ │ ├── SendMessageResponsePacket.java │ │ │ │ │ │ └── get │ │ │ │ │ │ └── GetMessageResponsePacket.java │ │ │ │ ├── send │ │ │ │ │ ├── add │ │ │ │ │ │ ├── friend │ │ │ │ │ │ │ └── approve │ │ │ │ │ │ │ │ └── SendFriendApprovalPacket.java │ │ │ │ │ │ └── group │ │ │ │ │ │ │ └── approve │ │ │ │ │ │ │ ├── SendAddGroupApprovalPacket.java │ │ │ │ │ │ │ ├── SendGroupApprovalPacket.java │ │ │ │ │ │ │ └── SendInviteGroupApprovalPacket.java │ │ │ │ │ ├── forward │ │ │ │ │ │ ├── SendMessagesForwardPacket.java │ │ │ │ │ │ ├── get │ │ │ │ │ │ │ └── GetForwardMessagePacket.java │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ └── SendGroupMessagesForwardPacket.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ └── SendPrivateMessagesForwardPacket.java │ │ │ │ │ ├── group │ │ │ │ │ │ ├── kick │ │ │ │ │ │ │ └── SendGroupKickPacket.java │ │ │ │ │ │ ├── leave │ │ │ │ │ │ │ └── SendLeaveGroupPacket.java │ │ │ │ │ │ ├── mute │ │ │ │ │ │ │ ├── SendGroupMutePacket.java │ │ │ │ │ │ │ ├── all │ │ │ │ │ │ │ │ └── SendGroupMuteAllPacket.java │ │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ │ ├── anonymous │ │ │ │ │ │ │ │ └── SendGroupMuteAnonymousPacket.java │ │ │ │ │ │ │ │ └── normal │ │ │ │ │ │ │ │ └── SendGroupMuteNormalPacket.java │ │ │ │ │ │ ├── name │ │ │ │ │ │ │ ├── SendGroupNameSetPacket.java │ │ │ │ │ │ │ └── card │ │ │ │ │ │ │ │ └── SetGroupNameCardPacket.java │ │ │ │ │ │ └── sign │ │ │ │ │ │ │ └── SendGroupSignPacket.java │ │ │ │ │ ├── message │ │ │ │ │ │ ├── SendMessagePacket.java │ │ │ │ │ │ ├── get │ │ │ │ │ │ │ └── GetMessagePacket.java │ │ │ │ │ │ ├── group │ │ │ │ │ │ │ └── SendGroupMessagePacket.java │ │ │ │ │ │ └── personal │ │ │ │ │ │ │ └── SendPrivateMessagePacket.java │ │ │ │ │ ├── poke │ │ │ │ │ │ └── SendPokePacket.java │ │ │ │ │ ├── recall │ │ │ │ │ │ └── SendRecallMessagePacket.java │ │ │ │ │ └── request │ │ │ │ │ │ └── ForwardMessagesRequestPacket.java │ │ │ │ └── writer │ │ │ │ │ └── PacketJSONBufWriter.java │ │ │ └── router │ │ │ │ ├── ApricotProxy.java │ │ │ │ ├── ApricotRouter.java │ │ │ │ └── NetworkRouter.java │ │ ├── plugin │ │ │ ├── Plugin.java │ │ │ ├── ext │ │ │ │ ├── captcha │ │ │ │ │ ├── CaptchaPlugin.java │ │ │ │ │ └── handler │ │ │ │ │ │ ├── CaptchaChecker.java │ │ │ │ │ │ ├── CaptchaPass.java │ │ │ │ │ │ ├── CaptchaWithGroup.java │ │ │ │ │ │ ├── CaptchaWithPrivate.java │ │ │ │ │ │ ├── JoinGroupCaptcha.java │ │ │ │ │ │ └── LeaveGroupCaptcha.java │ │ │ │ ├── example │ │ │ │ │ ├── ExamplePlugin.java │ │ │ │ │ ├── disinformation │ │ │ │ │ │ ├── CqCodeReproduce.java │ │ │ │ │ │ └── Disinformation.java │ │ │ │ │ ├── forward │ │ │ │ │ │ └── ForwardGetTest.java │ │ │ │ │ └── image │ │ │ │ │ │ └── draw │ │ │ │ │ │ └── DrawTest.java │ │ │ │ ├── grass │ │ │ │ │ ├── GrassPlugin.java │ │ │ │ │ └── handler │ │ │ │ │ │ ├── delete │ │ │ │ │ │ └── FastDelete.java │ │ │ │ │ │ ├── hitokoto │ │ │ │ │ │ └── Hitokoto.java │ │ │ │ │ │ ├── mute │ │ │ │ │ │ └── MuteMe.java │ │ │ │ │ │ ├── response │ │ │ │ │ │ └── QuickResponse.java │ │ │ │ │ │ └── status │ │ │ │ │ │ └── BotStatus.java │ │ │ │ └── lawn │ │ │ │ │ ├── Lawn.java │ │ │ │ │ └── handler │ │ │ │ │ ├── ApricotInformation.java │ │ │ │ │ ├── PokeReciprocity.java │ │ │ │ │ ├── Tests.java │ │ │ │ │ ├── media │ │ │ │ │ └── MediaDownload.java │ │ │ │ │ ├── message │ │ │ │ │ ├── export │ │ │ │ │ │ └── MessageExport.java │ │ │ │ │ └── recall │ │ │ │ │ │ ├── notice │ │ │ │ │ │ └── RecallNotice.java │ │ │ │ │ │ └── reproduce │ │ │ │ │ │ └── MessageReproducer.java │ │ │ │ │ └── reload │ │ │ │ │ └── Reloading.java │ │ │ ├── internal │ │ │ │ ├── bus │ │ │ │ │ ├── LawnBus.java │ │ │ │ │ └── handlers │ │ │ │ │ │ ├── BusHandler.java │ │ │ │ │ │ └── message │ │ │ │ │ │ ├── MessageBus.java │ │ │ │ │ │ ├── PokeBus.java │ │ │ │ │ │ └── RecallBus.java │ │ │ │ └── core │ │ │ │ │ └── lawn │ │ │ │ │ ├── LawnCore.java │ │ │ │ │ └── handler │ │ │ │ │ ├── echo │ │ │ │ │ └── InternalEchoResultHandler.java │ │ │ │ │ └── message │ │ │ │ │ ├── OthersMessageStorage.java │ │ │ │ │ ├── RecalledMessageHandler.java │ │ │ │ │ └── SelfMessageStore.java │ │ │ └── name │ │ │ │ └── PluginName.java │ │ ├── resource │ │ │ ├── dispenser │ │ │ │ └── ResourcesDispenser.java │ │ │ └── loader │ │ │ │ └── ResourcesLoader.java │ │ ├── server │ │ │ ├── ApricotServer.java │ │ │ ├── bootstrap │ │ │ │ └── ApricotBootstrap.java │ │ │ └── service │ │ │ │ ├── ConcurrentService.java │ │ │ │ ├── counter │ │ │ │ └── traffic │ │ │ │ │ └── TrafficCounter.java │ │ │ │ ├── echo │ │ │ │ └── EchoManager.java │ │ │ │ ├── event │ │ │ │ ├── EventManager.java │ │ │ │ └── exclusive │ │ │ │ │ ├── EventExclusive.java │ │ │ │ │ ├── EventExclusiveLevel.java │ │ │ │ │ └── EventExclusiveTarget.java │ │ │ │ ├── plugin │ │ │ │ ├── PluginManager.java │ │ │ │ └── loader │ │ │ │ │ └── JarSearchLoader.java │ │ │ │ └── task │ │ │ │ └── TaskManager.java │ │ ├── task │ │ │ └── intensive │ │ │ │ └── IntensiveType.java │ │ ├── thread │ │ │ └── pool │ │ │ │ ├── ExecutorEntrust.java │ │ │ │ └── ExecutorFactor.java │ │ └── util │ │ │ ├── bytes │ │ │ └── BytesUtil.java │ │ │ ├── collection │ │ │ └── ApricotCollectionFactor.java │ │ │ ├── digger │ │ │ └── MessageDigger.java │ │ │ ├── encryption │ │ │ └── Crypto.java │ │ │ ├── file │ │ │ └── FileUtil.java │ │ │ ├── io │ │ │ └── IOUtil.java │ │ │ ├── message │ │ │ ├── MessageProcess.java │ │ │ └── MessageUtil.java │ │ │ ├── process │ │ │ ├── AndPredicates.java │ │ │ └── OrPredicates.java │ │ │ ├── text │ │ │ ├── TextUtil.java │ │ │ └── UnicodeUtil.java │ │ │ ├── thread │ │ │ └── ThreadUtil.java │ │ │ └── time │ │ │ └── TimeUtil.java │ │ └── viburnum │ │ └── Viburnum.java │ └── zhuaidadaya │ └── rikaishinikui │ └── handler │ └── universal │ ├── affair │ └── Affair.java │ ├── entrust │ ├── EntrustEnvironment.java │ └── function │ │ ├── ExceptingConsumer.java │ │ ├── ExceptingFunction.java │ │ ├── ExceptingRunnable.java │ │ ├── ExceptingSupplier.java │ │ ├── TriConsumer.java │ │ └── TriFunction.java │ ├── option │ └── BiOption.java │ ├── pair │ └── Pair.java │ └── receptacle │ ├── Legacy.java │ └── Receptacle.java └── resources ├── apricot.banner ├── assets └── plugins │ ├── Apricot │ └── Apricot.json │ ├── Captcha │ ├── Captcha.json │ └── JoinGroup │ │ └── JoinGroup.json │ ├── Grass │ ├── FastDelete │ │ └── FastDelete.json │ ├── Grass.json │ ├── MuteMe │ │ └── MuteMe.json │ ├── QuickResponse │ │ └── QuickResponse.json │ └── WordResponse │ │ └── WordResponse.json │ └── Lawn │ └── Lawn.json ├── default-config.conf └── log4j2.xml /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | # Automatically build the project and run any configured tests for every push 2 | # and submitted pull request. This can help catch issues that only occur on 3 | # certain platforms or Java versions, and provides a first line of defence 4 | # against bad commits. 5 | 6 | name: build 7 | on: [ pull_request, push ] 8 | 9 | jobs: 10 | build: 11 | strategy: 12 | matrix: 13 | # Use these Java versions 14 | java: [ 15 | 19 16 | ] 17 | # and run on both Linux and Windows 18 | os: [ ubuntu-22.04, windows-2022 ] 19 | runs-on: ${{ matrix.os }} 20 | steps: 21 | - name: checkout repository 22 | uses: actions/checkout@v3 23 | - name: validate gradle wrapper 24 | uses: gradle/wrapper-validation-action@v1 25 | - name: setup jdk ${{ matrix.java }} 26 | uses: actions/setup-java@v3 27 | with: 28 | distribution: 'oracle' 29 | java-version: ${{ matrix.java }} 30 | cache: 'gradle' 31 | - name: make gradle wrapper executable 32 | if: ${{ runner.os != 'Windows' }} 33 | run: chmod +x ./gradlew 34 | - name: build 35 | run: ./gradlew build 36 | - name: capture build artifacts 37 | # Upload all artifacts 38 | uses: actions/upload-artifact@v3 39 | with: 40 | name: Artifacts 41 | path: build/libs/ 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # gradle 2 | .gradle/ 3 | build/ 4 | out/ 5 | classes/ 6 | 7 | # eclipse 8 | 9 | *.launch 10 | 11 | # idea 12 | 13 | .idea/ 14 | *.iml 15 | *.ipr 16 | *.iws 17 | 18 | # vscode 19 | 20 | .settings/ 21 | .vscode/ 22 | bin/ 23 | .classpath 24 | .project 25 | 26 | # macos 27 | 28 | *.DS_Store 29 | 30 | # apricot 31 | run/ 32 | logs/ 33 | test/ 34 | configs/ 35 | databases/ -------------------------------------------------------------------------------- /.run/ApricotBootstrap.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /README_EN_US.md: -------------------------------------------------------------------------------- 1 | #Other language 2 | **[中文](README.md)** -------------------------------------------------------------------------------- /deprecated/hasnasu/HanasuPlugin.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.hasnasu; 2 | 3 | import com.github.cao.awa.apricot.anntations.AutoPlugin; 4 | import com.github.cao.awa.apricot.plugin.Plugin; 5 | import com.github.cao.awa.apricot.plugin.ext.hasnasu.handler.HanasuHandler; 6 | import com.github.cao.awa.apricot.plugin.ext.hasnasu.handler.learn.HanasuLearn; 7 | import com.github.cao.awa.apricot.plugin.name.PluginName; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | @AutoPlugin 11 | public class HanasuPlugin extends Plugin { 12 | @Override 13 | public @NotNull PluginName name() { 14 | return PluginName.of("Hanasu", "はなすAI"); 15 | } 16 | 17 | @Override 18 | public void initialize() { 19 | registerHandlers(new HanasuHandler(), new HanasuLearn()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /deprecated/hasnasu/handler/model/ana/PreAnalysis.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.hasnasu.handler.model.ana; 2 | 3 | import com.github.cao.awa.apricot.util.text.TextUtil; 4 | 5 | import java.util.List; 6 | 7 | public class PreAnalysis { 8 | public List parseStr(String temp) { 9 | return TextUtil.splitToList(temp, ' '); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /deprecated/hasnasu/handler/model/chain/MarkovWordWeight.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.hasnasu.handler.model.chain; 2 | 3 | public class MarkovWordWeight { 4 | private String word; 5 | private int weight; 6 | 7 | public MarkovWordWeight(String word, int weight) { 8 | this.word = word; 9 | this.weight = weight; 10 | } 11 | 12 | public String getWord() { 13 | return this.word; 14 | } 15 | 16 | public MarkovWordWeight setWord(String word) { 17 | this.word = word; 18 | return this; 19 | } 20 | 21 | public int getWeight() { 22 | return this.weight; 23 | } 24 | 25 | public MarkovWordWeight setWeight(int weight) { 26 | this.weight = weight; 27 | return this; 28 | } 29 | 30 | public String toString() { 31 | return this.word + ":" + this.weight; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /doc/zh_cn/develop/plugin/README.md: -------------------------------------------------------------------------------- 1 | # 示例 2 | 以下是一个最简单化的插件,它会自动注册但不会处理任何事件 3 | 4 | 要处理事件,请看: [Event](/doc/zh_cn/develop/event/README.md)\ 5 | 要发送数据包,情看:[Packet](/doc/zh_cn/develop/packet/README.md) 6 | ```java 7 | /** 8 | * An example plugin. 9 | * 10 | * @since 1.0.0 11 | * @author cao_awa 12 | */ 13 | @AutoPlugin 14 | public class ExamplePlugin extends Plugin { 15 | private static final UUID ID = UUID.fromString("00000000-0000-0000-0000-000000000000"); 16 | 17 | // 可忽略 18 | @Override 19 | public UUID uuid() { 20 | return ID; 21 | } 22 | 23 | // 可忽略 24 | @Override 25 | public String version() { 26 | return "1.0.0"; 27 | } 28 | 29 | // 必要 30 | @Override 31 | public @NotNull PluginName name() { 32 | return PluginName.of( 33 | "Example", 34 | "生草机-示例" 35 | ); 36 | } 37 | 38 | // 必要 39 | @Override 40 | public void initialize() { 41 | // 在此处初始化插件 42 | // 执行各种需要的代码 43 | } 44 | } 45 | 46 | ``` 47 | 48 | 忽略任何可忽略的重写: 49 | ```java 50 | /** 51 | * An example plugin. 52 | * 53 | * @since 1.0.0 54 | * @author cao_awa 55 | */ 56 | @AutoPlugin 57 | public class ExamplePlugin extends Plugin { 58 | @Override 59 | public @NotNull PluginName name() { 60 | return PluginName.of( 61 | "Example", 62 | "生草机-示例" 63 | ); 64 | } 65 | 66 | @Override 67 | public void initialize() { 68 | System.out.println("初始化插件..."); 69 | } 70 | } 71 | 72 | ``` 73 | -------------------------------------------------------------------------------- /doc/zh_cn/develop/working_stream/README.md: -------------------------------------------------------------------------------- 1 | # 工作流程 2 | 虽然杏是公共项目,但这不代表杏可以被任何人随意修改 3 | 4 | 要修改杏需要首先经过自己和负责人的审查和测试 5 | 6 | \ 7 | 杏具有一套工作流程,来完成代码编辑、查错、合并等流程 8 | 9 | ## 创建分支 10 | 通过 ``` Fork ``` 创建一个分支,在此分支进行活动 11 | 12 | ## 获取代吗 13 | 通过克隆刚创建好的分支来获取代码 14 | 15 | ```bash 16 | git init 17 | git clone https://github.com/<用户名>/<分支名称> 18 | ``` 19 | 20 | 随后在支持git、gradle的工作环境中打开此项目 21 | 22 | 这时杏会被工作环境自行加载、构建,接下来稍加等待即可 23 | 24 | ## 编辑 25 | 在对代码做出修改前,务必阅读 [项目文档](/doc/zh_cn/develop/working_stream/project/codes/README.md) 26 | 27 | 合理使用项目中存在的库,避免重复造轮子或是错误使用一些库 28 | 29 | \ 30 | 尽量少修改 @Stable 注释的类或方法,这些内容已经是确认的稳定版本 31 | 32 | 尽量少修改 @Unsupported 注释的类或方法,除非你有把握解决各种问题 33 | 34 | ## 查错 35 | 36 | ## 署名 37 | 请在查错结束后对代码(类、方法)进行署名以及编辑简单Java Doc文档。 38 | 39 | ## 调试 40 | 41 | ## 合并(拉取请求) 42 | 通过 ``` Pull Request ``` 将完成以上流程的分支推送到主分支 43 | 44 | 概述修改的内容即可,无需定位到具体的代码 45 | 46 | ## 最后 47 | 在完成整个工作流程以后可以将分支删除 48 | 49 | 或不要再进行修改,直到下一次的工作流程需要时,将主分支拉取至此分支 50 | 51 | # 出现问题 52 | ## 拒绝合并 53 | 当分支推送到主分支的代码存在一些bug,或是一些恶意修改时 54 | 55 | 往往会被负责人拒绝合并至主分支 56 | 57 | 当发生这一情况时,可以通过解释、沟通、修改的方式解决 58 | 59 | \ 60 | 一些时候可能是因为修改内容是多余的,或新增的功能是有争议或其他情况的 61 | 62 | 此时应当从社区获取建议以决定是否保留这些内容 63 | 64 | ## 合并出错 65 | 当分支版本与主分支版本不一致时,导致合并出错 66 | 67 | 解决办法是拉取主分支的变更,然后修改冲突,额外进行一遍工作流程 68 | 69 | # 作为负责人 70 | 若要加入杏的审查、测试工作,请看:[官方工作流程](/doc/zh_cn/develop/working_stream/official/README.md) 71 | -------------------------------------------------------------------------------- /doc/zh_cn/develop/working_stream/official/README.md: -------------------------------------------------------------------------------- 1 | # 官方工作流程 2 | ## Pull Request 3 | 4 | ## Issues -------------------------------------------------------------------------------- /doc/zh_cn/develop/working_stream/project/codes/README.md: -------------------------------------------------------------------------------- 1 | # 项目文档 2 | ## 第三方库 3 | * Netty 4 | * Reflections 5 | * Apache Logging 6 | * Apache Commons Logging 7 | * Apache Commons IO 8 | * Apache Commons Codec 9 | * Fast JSON 10 | * Level DB 11 | 12 | ## 内部库 13 | * EntrustEnvironment 14 | * ApricotCollectionFactor 15 | * [Base256](/doc/zh_cn/develop/working_stream/project/codes/math/Base256.md) 16 | * Receptacle 17 | * Affair 18 | * BytesReader 19 | * RandomIdentifier 20 | * InformationCompressor 21 | * Configure 22 | * ApsConfig 23 | * ApricotDatabase 24 | * ResourceLoader / ResourceDispenser 25 | -------------------------------------------------------------------------------- /doc/zh_cn/performance/bootstrap/bootstrap_time.md: -------------------------------------------------------------------------------- 1 | # 时间 2 | 杏的完全启动时间通常在1~2秒以内,基于以下测试平台: 3 | ``` 4 | OS: Windows 10 - 21H1 19043.2075 5 | CPU: Intel Core i5-10600 6 | Memory: DDR4 2666Mhz 64G 7 | Disk: Intel 660P 1T 8 | JDK: OpenJDK 64-Bit Server VM (build 19+36-2238, mixed mode, sharing) 9 | Args: -Xmx200M -Xms200M 10 | ``` 11 | 12 | # 极限情况 13 | 杏在以上测试平台下,加载2.27G共185个插件没什么用的情况下耗时为11646ms,在12s内完成 14 | -------------------------------------------------------------------------------- /doc/zh_cn/visualization/visualization.drawio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cao-awa/Apricot/45a46cd9fddf43387b9d84e4b4c7f978d7d2079a/doc/zh_cn/visualization/visualization.drawio.png -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | main_class=com.github.cao.awa.apricot.server.bootstrap.ApricotBootstrap 2 | version_name=1.0.0 -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cao-awa/Apricot/45a46cd9fddf43387b9d84e4b4c7f978d7d2079a/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'Apricot' 2 | 3 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/anntations/Auto.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.anntations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Auto 6 | @Stable 7 | @Retention(RetentionPolicy.RUNTIME) 8 | @Target({ElementType.TYPE, ElementType.METHOD}) 9 | public @interface Auto { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/anntations/AutoHandlerFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.anntations; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Auto 9 | @Stable 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @Target(ElementType.TYPE) 12 | public @interface AutoHandlerFactor { 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/anntations/AutoPlugin.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.anntations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Auto 6 | @Stable 7 | @Retention(RetentionPolicy.RUNTIME) 8 | @Target(ElementType.TYPE) 9 | public @interface AutoPlugin { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/anntations/Planning.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.anntations; 2 | 3 | import java.lang.annotation.Retention; 4 | import java.lang.annotation.RetentionPolicy; 5 | import java.lang.annotation.Target; 6 | 7 | import static java.lang.annotation.ElementType.*; 8 | import static java.lang.annotation.ElementType.TYPE; 9 | 10 | @Unsupported 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(value = {CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE}) 13 | public @interface Planning { 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/anntations/Stable.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.anntations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | import static java.lang.annotation.ElementType.*; 6 | 7 | @Stable 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(value = {CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE}) 10 | public @interface Stable { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/anntations/Synchronized.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.anntations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Stable 6 | @Retention(RetentionPolicy.RUNTIME) 7 | @Target(ElementType.TYPE) 8 | public @interface Synchronized { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/anntations/Unsupported.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.anntations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | import static java.lang.annotation.ElementType.*; 6 | 7 | @Stable 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(value = {CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE}) 10 | public @interface Unsupported { 11 | String[] value() default ""; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/anntations/Warning.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.anntations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | import static java.lang.annotation.ElementType.*; 6 | 7 | @Stable 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(value = {CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE}) 10 | public @interface Warning { 11 | String[] value(); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/approval/group/ApprovalType.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.approval.group; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | public enum ApprovalType { 7 | ADD("add"), INVITE("invite"); 8 | 9 | private final String name; 10 | 11 | ApprovalType(String name) { 12 | this.name = name; 13 | } 14 | 15 | public String getName() { 16 | return this.name; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/banner/Banner.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.banner; 2 | 3 | import com.github.cao.awa.apricot.util.text.*; 4 | 5 | import java.util.*; 6 | import java.util.function.*; 7 | 8 | public class Banner { 9 | private final List lines; 10 | 11 | public Banner(String banner) { 12 | this.lines = TextUtil.splitToList(banner, '\n'); 13 | } 14 | 15 | public void forEach(Consumer action) { 16 | this.lines.forEach(action); 17 | } 18 | 19 | public String get(int index) { 20 | return this.lines.get(index); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/command/Command.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.command; 2 | 3 | public class Command { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/database/ApricotDatabase.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.database; 2 | 3 | import java.util.function.*; 4 | 5 | public abstract class ApricotDatabase { 6 | public abstract void forEach(BiConsumer action); 7 | 8 | public abstract void set(K key, V value); 9 | 10 | public abstract V get(K key); 11 | 12 | public abstract V delete(K key); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/database/empty/EmptyDatabase.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.database.empty; 2 | 3 | import com.github.cao.awa.apricot.database.*; 4 | 5 | import java.util.function.*; 6 | 7 | public class EmptyDatabase extends ApricotDatabase { 8 | @Override 9 | public void forEach(BiConsumer action) { 10 | 11 | } 12 | 13 | @Override 14 | public void set(K key, V value) { 15 | 16 | } 17 | 18 | @Override 19 | public V get(K key) { 20 | return null; 21 | } 22 | 23 | @Override 24 | public V delete(K key) { 25 | return null; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/debug/monitor/Monitor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.debug.monitor; 2 | 3 | public class Monitor { 4 | } 5 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/Compulsory.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler; 2 | 3 | public interface Compulsory { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/add/friend/AddFriendEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.add.friend; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.add.friend.*; 5 | 6 | public abstract class AddFriendEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "request-friend"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onAdd(AddFriendEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/add/group/AddGroupEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.add.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.add.group.*; 5 | 6 | public abstract class AddGroupEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "request-group-add"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onAdd(AddGroupEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/add/group/InviteGroupEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.add.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.add.group.*; 5 | 6 | public abstract class InviteGroupEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "request-group-invite"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onInvite(InviteGroupEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/invalid/InvalidDataReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.invalid; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.invalid.*; 5 | 6 | public abstract class InvalidDataReceivedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "invalid-data"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onInvalid(InvalidDataReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/lifecycle/disconnect/ProxyConnectEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.lifecycle.disconnect; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.lifecycle.*; 5 | 6 | public abstract class ProxyConnectEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "meta-lifecycle-connect"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onConnect(ProxyConnectEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/lifecycle/disconnect/ProxyDisconnectEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.lifecycle.disconnect; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.lifecycle.*; 5 | 6 | public abstract class ProxyDisconnectEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "meta-lifecycle-disconnect"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onDisconnect(ProxyDisconnectEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/member/change/GroupMemberChangedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.member.change; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.*; 5 | 6 | public abstract class GroupMemberChangedEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-member-changed"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onApproved(GroupMemberChangedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/member/change/decrease/GroupMemberDecreasedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.member.change.decrease; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.decrease.*; 5 | 6 | public abstract class GroupMemberDecreasedEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-member-decrease"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onDecrease(GroupMemberDecreasedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/member/change/decrease/bot/BotDiedFromGroupEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.member.change.decrease.bot; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.decrease.bot.*; 5 | 6 | public abstract class BotDiedFromGroupEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-decrease-kick-me"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onDied(BotDiedFromGroupEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/member/change/decrease/kick/GroupMemberKickedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.member.change.decrease.kick; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.decrease.kick.*; 5 | 6 | public abstract class GroupMemberKickedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-increase-approve"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onKicked(GroupMemberKickedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/member/change/decrease/leave/GroupMemberLeavedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.member.change.decrease.leave; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.decrease.leave.*; 5 | 6 | public abstract class GroupMemberLeavedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-decrease-leave"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onLeaved(GroupMemberLeavedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/member/change/increase/GroupMemberIncreasedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.member.change.increase; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.increase.*; 5 | 6 | public abstract class GroupMemberIncreasedEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-member-increased"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onIncrease(GroupMemberIncreasedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/member/change/increase/approve/GroupMemberApprovedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.member.change.increase.approve; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.increase.approve.*; 5 | 6 | public abstract class GroupMemberApprovedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-increase-approve"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onApproved(GroupMemberApprovedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/member/change/increase/invite/GroupMemberInvitedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.member.change.increase.invite; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.increase.invite.*; 5 | 6 | public abstract class GroupMemberInvitedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-increase-invite"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onInvited(GroupMemberInvitedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/MessageEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.*; 5 | 6 | public abstract class MessageEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "message"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessage(MessageEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/recall/MessageRecallEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.recall; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.recall.*; 5 | 6 | public abstract class MessageRecallEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "notice-recall"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onRecall(MessageRecallEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/recall/group/GroupMessageRecallEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.recall.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.recall.group.*; 5 | 6 | public abstract class GroupMessageRecallEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "notice-group-recall"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onRecall(GroupMessageRecallEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/recall/personal/PrivateMessageRecallEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.recall.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.recall.personal.*; 5 | 6 | public abstract class PrivateMessageRecallEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "notice-friend-recall"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onRecall(PrivateMessageRecallEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/received/MessageReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.received; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.*; 5 | 6 | public abstract class MessageReceivedEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-received"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageReceived(MessageReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/received/group/GroupAnonymousMessageReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.received.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.group.received.*; 5 | 6 | public abstract class GroupAnonymousMessageReceivedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-group-anonymous"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageReceived(GroupAnonymousMessageReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/received/group/GroupMessageReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.received.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.group.received.*; 5 | 6 | public abstract class GroupMessageReceivedEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-group"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageReceived(GroupMessageReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/received/group/GroupNormalMessageReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.received.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.group.received.*; 5 | 6 | public abstract class GroupNormalMessageReceivedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-group-normal"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageReceived(GroupNormalMessageReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/received/personal/PrivateFriendMessageReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.received.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.personal.received.*; 5 | 6 | public abstract class PrivateFriendMessageReceivedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-private-friend"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageReceived(PrivateFriendMessageReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/received/personal/PrivateMessageReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.received.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.personal.received.*; 5 | 6 | public abstract class PrivateMessageReceivedEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-private"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageReceived(PrivateMessageReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/received/personal/PrivateTemporaryMessageReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.received.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.personal.received.*; 5 | 6 | public abstract class PrivateTemporaryMessageReceivedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-private-temporary"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageReceived(PrivateTemporaryMessageReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/sent/MessageSentEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.sent; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.*; 5 | 6 | public abstract class MessageSentEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-sent"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageReceived(MessageSentEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/sent/group/GroupAnonymousMessageSentEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.sent.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.group.sent.*; 5 | 6 | public abstract class GroupAnonymousMessageSentEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-sent-group-anonymous"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageSent(GroupAnonymousMessageSentEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/sent/group/GroupMessageSentEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.sent.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.group.sent.*; 5 | 6 | public abstract class GroupMessageSentEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-sent-group"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageSent(GroupMessageSentEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/sent/group/GroupNormalMessageSentEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.sent.group; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.group.sent.*; 5 | 6 | public abstract class GroupNormalMessageSentEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-sent-group-normal"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageSent(GroupNormalMessageSentEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/sent/personal/PrivateFriendMessageSentEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.sent.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.personal.sent.*; 5 | 6 | public abstract class PrivateFriendMessageSentEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-sent-private-friend"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageSent(PrivateFriendMessageSentEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/sent/personal/PrivateMessageSentEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.sent.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.personal.sent.*; 5 | 6 | public abstract class PrivateMessageSentEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-private"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageSent(PrivateMessageSentEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/message/sent/personal/PrivateTemporaryMessageSentEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.message.sent.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.message.personal.sent.*; 5 | 6 | public abstract class PrivateTemporaryMessageSentEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "message-sent-private-temporary"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMessageSent(PrivateTemporaryMessageSentEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/mute/issue/IssueGroupMuteEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.mute.issue; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.mute.issue.*; 5 | 6 | public abstract class IssueGroupMuteEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-ban-ban"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMute(IssueGroupMuteEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/mute/issue/all/IssueGroupAllMuteEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.mute.issue.all; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.mute.issue.all.*; 5 | 6 | public abstract class IssueGroupAllMuteEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-ban-all"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMute(IssueGroupAllMuteEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/mute/issue/personal/IssueGroupPersonalMuteEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.mute.issue.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.mute.issue.personal.*; 5 | 6 | public abstract class IssueGroupPersonalMuteEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-ban-personal"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onMute(IssueGroupPersonalMuteEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/mute/lift/LiftGroupMuteEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.mute.lift; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.mute.lift.*; 5 | 6 | public abstract class LiftGroupMuteEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-lift-ban"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onLift(LiftGroupMuteEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/mute/lift/all/LiftGroupAllMuteEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.mute.lift.all; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.mute.lift.all.*; 5 | 6 | public abstract class LiftGroupAllMuteEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-lift-all"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onLift(LiftGroupAllMuteEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/mute/lift/personal/LiftGroupPersonalMuteEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.mute.lift.personal; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.mute.lift.personal.*; 5 | 6 | public abstract class LiftGroupPersonalMuteEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-group-lift-personal"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onLift(LiftGroupPersonalMuteEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/name/card/GroupNameCardChangedReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.name.card; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.event.handler.*; 5 | import com.github.cao.awa.apricot.event.receive.name.card.*; 6 | 7 | /** 8 | * The name card change maybe not real time.
9 | *
10 | * If the proxy to qq is 'cq-http' then this event will be happened under user sent at least one messages.
11 | * The not real time warning is only against for 'cq-http'
12 | */ 13 | @Warning("NOT_REAL_TIME") 14 | public abstract class GroupNameCardChangedReceivedEventHandler extends EventHandler { 15 | /** 16 | * Which type event is target of this handler. 17 | * 18 | * @author cao_awa 19 | * @since 1.0.0 20 | */ 21 | @Override 22 | public String getType() { 23 | return "notice-group-card"; 24 | } 25 | 26 | /** 27 | * Process event. 28 | * 29 | * @param event 30 | * event 31 | * @author 草二号机 32 | * @since 1.0.0 33 | */ 34 | public abstract void onChanged(GroupNameCardChangedReceivedEvent event); 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/name/title/GroupTitleChangedReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.name.title; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.name.title.*; 5 | 6 | public abstract class GroupTitleChangedReceivedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public String getType() { 15 | return "notice-notify-title"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | public abstract void onChanged(GroupTitleChangedReceivedEvent event); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/poke/GroupPokeReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.poke; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.poke.*; 5 | 6 | public abstract class GroupPokeReceivedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "notice-poke-group"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onPoke(GroupPokeReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/poke/PokeReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.poke; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.poke.*; 5 | 6 | public abstract class PokeReceivedEventHandler extends EventHandler> { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "notice-poke"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onPoke(PokeReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/poke/PrivatePokeReceivedEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.poke; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.poke.*; 5 | 6 | public abstract class PrivatePokeReceivedEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "notice-poke-private"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onPoke(PrivatePokeReceivedEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/handler/response/EchoResultEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.handler.response; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.receive.response.*; 5 | 6 | public abstract class EchoResultEventHandler extends EventHandler { 7 | /** 8 | * Which type event is target of this handler. 9 | * 10 | * @author cao_awa 11 | * @since 1.0.0 12 | */ 13 | @Override 14 | public final String getType() { 15 | return "echo-result"; 16 | } 17 | 18 | /** 19 | * Process event. 20 | * 21 | * @param event 22 | * event 23 | * @author cao_awa 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void onResult(EchoResultEvent event); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/Event.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.network.packet.*; 5 | import com.github.cao.awa.apricot.network.router.*; 6 | 7 | import java.util.*; 8 | 9 | public abstract class Event { 10 | private final ApricotProxy proxy; 11 | private final T packet; 12 | private boolean exclusive; 13 | 14 | public Event(ApricotProxy proxy, T packet) { 15 | this.proxy = proxy; 16 | this.packet = packet; 17 | } 18 | 19 | public boolean isExclusive() { 20 | return this.exclusive; 21 | } 22 | 23 | public void setExclusive(boolean exclusive) { 24 | this.exclusive = exclusive; 25 | } 26 | 27 | public T getPacket() { 28 | return this.packet; 29 | } 30 | 31 | public ApricotProxy proxy() { 32 | return this.proxy; 33 | } 34 | 35 | public String toString() { 36 | return pipeline() + "(" + super.toString() + ")"; 37 | } 38 | 39 | public abstract Set pipeline(); 40 | 41 | /** 42 | * Fire event, let event entrust handler to process self. 43 | * 44 | * @param handler 45 | * handler 46 | * @author cao_awa 47 | * @author 草二号机 48 | * @since 1.0.0 49 | */ 50 | public abstract void fireEvent(EventHandler handler); 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/member/change/GroupMemberChangedEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.member.change; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.member.change.*; 5 | import com.github.cao.awa.apricot.event.receive.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.member.change.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class GroupMemberChangedEvent extends Event { 10 | public GroupMemberChangedEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof GroupMemberChangedEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onApproved(this); 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/member/change/decrease/GroupMemberDecreasedEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.member.change.decrease; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.member.change.decrease.*; 5 | import com.github.cao.awa.apricot.event.receive.member.change.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.member.change.decrease.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class GroupMemberDecreasedEvent extends GroupMemberChangedEvent { 10 | public GroupMemberDecreasedEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof GroupMemberDecreasedEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onDecrease(this); 33 | } 34 | } 35 | super.fireEvent(handler); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/member/change/increase/GroupMemberIncreasedEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.member.change.increase; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.member.change.increase.*; 5 | import com.github.cao.awa.apricot.event.receive.member.change.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.member.change.increase.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class GroupMemberIncreasedEvent extends GroupMemberChangedEvent { 10 | public GroupMemberIncreasedEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof GroupMemberIncreasedEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onIncrease(this); 33 | } 34 | } 35 | super.fireEvent(handler); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/message/MessageEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.message; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.message.*; 5 | import com.github.cao.awa.apricot.event.receive.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class MessageEvent extends Event { 10 | public MessageEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof MessageEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onMessage(this); 33 | } 34 | } 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/message/MessageReceivedEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.message; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.message.received.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.*; 6 | import com.github.cao.awa.apricot.network.router.*; 7 | 8 | public abstract class MessageReceivedEvent extends MessageEvent { 9 | public MessageReceivedEvent(ApricotProxy proxy, T packet) { 10 | super( 11 | proxy, 12 | packet 13 | ); 14 | } 15 | 16 | /** 17 | * Fire event, let event entrust handler to process self. 18 | * 19 | * @param handler 20 | * handler 21 | * @author cao_awa 22 | * @author 草二号机 23 | * @since 1.0.0 24 | */ 25 | @Override 26 | public void fireEvent(EventHandler handler) { 27 | if (handler instanceof MessageReceivedEventHandler eventHandler) { 28 | if (this.isExclusive()) { 29 | eventHandler.onExclusive(this); 30 | } else { 31 | eventHandler.onMessageReceived(this); 32 | } 33 | } 34 | super.fireEvent(handler); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/message/MessageSentEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.message; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.message.sent.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.*; 6 | import com.github.cao.awa.apricot.network.router.*; 7 | 8 | public abstract class MessageSentEvent extends MessageEvent { 9 | public MessageSentEvent(ApricotProxy proxy, T packet) { 10 | super( 11 | proxy, 12 | packet 13 | ); 14 | } 15 | 16 | /** 17 | * Fire event, let event entrust handler to process self. 18 | * 19 | * @param handler 20 | * handler 21 | * @author cao_awa 22 | * @author 草二号机 23 | * @since 1.0.0 24 | */ 25 | @Override 26 | public void fireEvent(EventHandler handler) { 27 | if (handler instanceof MessageSentEventHandler eventHandler) { 28 | if (this.isExclusive()) { 29 | eventHandler.onExclusive(this); 30 | } else { 31 | eventHandler.onMessageReceived(this); 32 | } 33 | } 34 | super.fireEvent(handler); 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/message/group/received/GroupMessageReceivedEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.message.group.received; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.message.received.group.*; 5 | import com.github.cao.awa.apricot.event.receive.message.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.group.received.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class GroupMessageReceivedEvent extends MessageReceivedEvent { 10 | public GroupMessageReceivedEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof GroupMessageReceivedEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onMessageReceived(this); 33 | } 34 | } 35 | super.fireEvent(handler); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/message/group/sent/GroupMessageSentEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.message.group.sent; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.message.sent.group.*; 5 | import com.github.cao.awa.apricot.event.receive.message.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.group.sent.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class GroupMessageSentEvent extends MessageSentEvent { 10 | public GroupMessageSentEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof GroupMessageSentEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onMessageSent(this); 33 | } 34 | } 35 | super.fireEvent(handler); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/message/personal/received/PrivateMessageReceivedEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.message.personal.received; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.message.received.personal.*; 5 | import com.github.cao.awa.apricot.event.receive.message.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.personal.received.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class PrivateMessageReceivedEvent extends MessageReceivedEvent { 10 | public PrivateMessageReceivedEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof PrivateMessageReceivedEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onMessageReceived(this); 33 | } 34 | } 35 | super.fireEvent(handler); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/message/personal/sent/PrivateMessageSentEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.message.personal.sent; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.message.sent.personal.*; 5 | import com.github.cao.awa.apricot.event.receive.message.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.personal.sent.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class PrivateMessageSentEvent extends MessageSentEvent { 10 | public PrivateMessageSentEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof PrivateMessageSentEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onMessageSent(this); 33 | } 34 | } 35 | super.fireEvent(handler); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/message/recall/MessageRecallEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.message.recall; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.message.recall.*; 5 | import com.github.cao.awa.apricot.event.receive.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.recall.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class MessageRecallEvent extends Event { 10 | public MessageRecallEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof MessageRecallEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onRecall(this); 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/receive/poke/PokeReceivedEvent.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.receive.poke; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.event.handler.poke.*; 5 | import com.github.cao.awa.apricot.event.receive.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.poke.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | 9 | public abstract class PokeReceivedEvent extends Event { 10 | public PokeReceivedEvent(ApricotProxy proxy, T packet) { 11 | super( 12 | proxy, 13 | packet 14 | ); 15 | } 16 | 17 | /** 18 | * Fire event, let event entrust handler to process self. 19 | * 20 | * @param handler 21 | * handler 22 | * @author cao_awa 23 | * @author 草二号机 24 | * @since 1.0.0 25 | */ 26 | @Override 27 | public void fireEvent(EventHandler handler) { 28 | if (handler instanceof PokeReceivedEventHandler eventHandler) { 29 | if (this.isExclusive()) { 30 | eventHandler.onExclusive(this); 31 | } else { 32 | eventHandler.onPoke(this); 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/event/target/EventTarget.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.event.target; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | public record EventTarget(long group, long person, long bot) { 7 | public static final EventTarget INVALID = new EventTarget( 8 | - 1, 9 | - 1, 10 | - 1 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/http/receptacle/ResponseReceptacle.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.http.receptacle; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.*; 5 | import com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.function.*; 6 | import okhttp3.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public record ResponseReceptacle(Response response) { 10 | @Nullable 11 | public JSONObject json() { 12 | try { 13 | System.out.println(this.response.body() 14 | .string()); 15 | }catch (Exception e) { 16 | e.printStackTrace(); 17 | } 18 | return EntrustEnvironment.trys(() -> new JSONObject(JSONObject.parse(this.response.body() 19 | .string()))); 20 | } 21 | 22 | public void operation(ExceptingConsumer action) { 23 | EntrustEnvironment.operation( 24 | response, 25 | action 26 | ); 27 | } 28 | 29 | @Nullable 30 | public String string() { 31 | return EntrustEnvironment.trys(() -> this.response.body() 32 | .string()); 33 | } 34 | 35 | public String message() { 36 | return this.response.message(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/identifier/FileRandomIdentifier.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.identifier; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.*; 5 | 6 | import java.util.*; 7 | 8 | @Stable 9 | public class FileRandomIdentifier { 10 | private static final char[] CHARS = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '_', '-'}; 11 | private static final Random RANDOM = new Random(); 12 | 13 | public static String create() { 14 | return create(1024); 15 | } 16 | 17 | public static String create(int size) { 18 | return new String(EntrustEnvironment.operation( 19 | new char[size], 20 | result -> { 21 | for (int i = 0; i < size; i++) { 22 | result[i] = CHARS[RANDOM.nextInt(CHARS.length)]; 23 | } 24 | } 25 | )); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/identifier/RandomIdentifier.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.identifier; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.*; 5 | 6 | import java.util.*; 7 | 8 | @Stable 9 | public class RandomIdentifier { 10 | private static final char[] CHARS = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '_', '[', ']', '/', '\\', '{', '}', '?', ',', ';', '\'', '\"', '!', '@', '#', '*', '(', ')', '&', '^', '$', '-', '=', '+', '`', '|', ' ', ':',}; 11 | private static final Random RANDOM = new Random(); 12 | 13 | public static String create() { 14 | return create(1024); 15 | } 16 | 17 | public static String create(int size) { 18 | return new String(EntrustEnvironment.operation( 19 | new char[size], 20 | result -> { 21 | for (int i = 0; i < size; i++) { 22 | result[i] = CHARS[RANDOM.nextInt(CHARS.length)]; 23 | } 24 | } 25 | )); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/information/compressor/InformationCompressor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.information.compressor; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | /** 6 | * Information compress. 7 | * 8 | * @author cao_awa 9 | * @since 1.0.0 10 | */ 11 | @Stable 12 | public interface InformationCompressor { 13 | byte[] EMPTY_BYTES = new byte[0]; 14 | 15 | /** 16 | * Compress for a data 17 | * 18 | * @param bytes 19 | * Data source 20 | * @return Compress result 21 | */ 22 | byte[] compress(byte[] bytes); 23 | 24 | /** 25 | * Decompress for a data 26 | * 27 | * @param bytes 28 | * Data source 29 | * @return Decompress result 30 | */ 31 | byte[] decompress(byte[] bytes); 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/information/compressor/lz4/Lz4Compressor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.information.compressor.lz4; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.information.compressor.*; 5 | import net.jpountz.lz4.*; 6 | 7 | @Stable 8 | public class Lz4Compressor implements InformationCompressor { 9 | public static final Lz4Compressor INSTANCE = new Lz4Compressor(); 10 | 11 | /** 12 | * Compress using lz4 with the fastest compression 13 | * 14 | * @param bytes 15 | * Data source 16 | * @return Compress result 17 | */ 18 | public byte[] compress(byte[] bytes) { 19 | return LZ4Factory.fastestInstance() 20 | .fastCompressor() 21 | .compress(bytes); 22 | } 23 | 24 | /** 25 | * Decompress using lz4 26 | * 27 | * @param bytes 28 | * Data source 29 | * @return Decompress result 30 | */ 31 | public byte[] decompress(byte[] bytes) { 32 | return LZ4Factory.fastestInstance() 33 | .fastDecompressor() 34 | .decompress( 35 | bytes, 36 | bytes.length 37 | ); 38 | } 39 | } -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/mathematic/Mathematics.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.mathematic; 2 | 3 | import java.util.Arrays; 4 | import java.util.Comparator; 5 | 6 | public class Mathematics { 7 | @SafeVarargs 8 | public static T streamMax(T... targets) { 9 | return Arrays.stream(targets) 10 | .max(Comparator.comparingDouble(Number :: doubleValue)) 11 | .orElseGet(() -> forMax(targets)); 12 | } 13 | 14 | @SafeVarargs 15 | public static T forMax(T... targets) { 16 | T max = targets[0]; 17 | for (T t : targets) { 18 | if (t.doubleValue() > max.doubleValue()) { 19 | max = t; 20 | } 21 | } 22 | return max; 23 | } 24 | 25 | // public static T max(T t1, T t2, T t3) { 26 | // T middle = t1.doubleValue() > t2.doubleValue() ? t1 : t2; 27 | // T max = middle.doubleValue() > t3.doubleValue() ? middle : t3; 28 | // return max; 29 | // } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/mathematic/integer/IntegerReceptacle.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.mathematic.integer; 2 | 3 | public class IntegerReceptacle { 4 | private int value; 5 | 6 | public IntegerReceptacle(int value) { 7 | this.value = value; 8 | } 9 | 10 | public static IntegerReceptacle of(int value) { 11 | return new IntegerReceptacle(value); 12 | } 13 | 14 | public IntegerReceptacle subtract(int value) { 15 | this.value -= value; 16 | return this; 17 | } 18 | 19 | public IntegerReceptacle subtract() { 20 | this.value--; 21 | return this; 22 | } 23 | 24 | public IntegerReceptacle add(int value) { 25 | this.value -= value; 26 | return this; 27 | } 28 | 29 | public IntegerReceptacle add() { 30 | this.value++; 31 | return this; 32 | } 33 | 34 | public int get() { 35 | return this.value; 36 | } 37 | 38 | public IntegerReceptacle set(int value) { 39 | this.value = value; 40 | return this; 41 | } 42 | 43 | public IntegerReceptacle multiply(int value) { 44 | this.value *= value; 45 | return this; 46 | } 47 | 48 | public IntegerReceptacle divide(int value) { 49 | this.value /= value; 50 | return this; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/Message.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | public abstract class Message { 7 | public abstract M participate(T element); 8 | 9 | public abstract String toPlainText(); 10 | 11 | public abstract T get(int index); 12 | 13 | public abstract int size(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/MessageType.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | public enum MessageType { 7 | PRIVATE("private"), GROUP("group"), @Unsupported GUILD("guild"); 8 | 9 | private final String name; 10 | 11 | MessageType(String name) { 12 | this.name = name; 13 | } 14 | 15 | public static MessageType of(String name) { 16 | return switch (name.toLowerCase()) { 17 | case "private" -> PRIVATE; 18 | case "group" -> GROUP; 19 | case "guild" -> GUILD; 20 | default -> throw new IllegalArgumentException("Unable to find type: '" + name + "'"); 21 | }; 22 | } 23 | 24 | public String getName() { 25 | return this.name; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/carve/CarvedMessage.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.carve; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.message.*; 5 | import com.github.cao.awa.apricot.message.element.*; 6 | import com.github.cao.awa.apricot.util.collection.*; 7 | 8 | import java.util.*; 9 | 10 | @Stable 11 | public class CarvedMessage extends Message> { 12 | private final List elements = ApricotCollectionFactor.arrayList(); 13 | 14 | public T get(int index) { 15 | return this.elements.get(index); 16 | } 17 | 18 | @Override 19 | public int size() { 20 | return this.elements.size(); 21 | } 22 | 23 | @Override 24 | public CarvedMessage participate(T element) { 25 | this.elements.add(element); 26 | return this; 27 | } 28 | 29 | public String toPlainText() { 30 | StringBuilder builder = new StringBuilder(); 31 | for (T element : this.elements) { 32 | builder.append(element.toPlainText()); 33 | } 34 | return builder.toString(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/MessageElement.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.message.assemble.*; 5 | 6 | @Stable 7 | public abstract class MessageElement { 8 | public abstract String toPlainText(); 9 | 10 | public abstract String getShortName(); 11 | 12 | public AssembledMessage toMessage() { 13 | return AssembledMessage.of() 14 | .participate(this); 15 | } 16 | 17 | public boolean shouldIncinerate() { 18 | return false; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/at/AtMessageElement.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.at; 2 | 3 | import com.github.cao.awa.apricot.anntations.Stable; 4 | import com.github.cao.awa.apricot.message.element.*; 5 | import com.github.cao.awa.apricot.message.element.cq.at.target.*; 6 | 7 | @Stable 8 | public class AtMessageElement extends MessageElement { 9 | private final AtTarget target; 10 | 11 | private AtMessageElement(AtTarget target) { 12 | this.target = target; 13 | } 14 | 15 | public static AtMessageElement at(AtTarget target) { 16 | return new AtMessageElement(target); 17 | } 18 | 19 | public AtTarget getTarget() { 20 | return this.target; 21 | } 22 | 23 | public String toString() { 24 | return "AtMessageElement{qq=" + this.target + "}"; 25 | } 26 | 27 | @Override 28 | public String toPlainText() { 29 | return "[CQ:at,qq=" + this.target + "]"; 30 | } 31 | 32 | @Override 33 | public String getShortName() { 34 | return "AtMessageElement{" + this.target + "}"; 35 | } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/at/target/AtTargetType.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.at.target; 2 | 3 | public enum AtTargetType { 4 | PERSON(), ALL() 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/face/FaceMessageElement.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.face; 2 | 3 | import com.github.cao.awa.apricot.anntations.Stable; 4 | import com.github.cao.awa.apricot.message.element.*; 5 | 6 | @Stable 7 | public class FaceMessageElement extends MessageElement { 8 | private final int id; 9 | 10 | private FaceMessageElement(int id) { 11 | this.id = id; 12 | } 13 | 14 | public static FaceMessageElement face(int id) { 15 | return new FaceMessageElement(id); 16 | } 17 | 18 | public int getId() { 19 | return this.id; 20 | } 21 | 22 | @Override 23 | public String toPlainText() { 24 | return "[CQ:face,id=" + this.id + "]"; 25 | } 26 | 27 | @Override 28 | public String getShortName() { 29 | return "FaceMessageElement{" + this.id + "}"; 30 | } 31 | 32 | public String toString() { 33 | return "FaceMessageElement{id=" + this.id + "}"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/CqDeserializer.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.server.*; 5 | import com.github.cao.awa.apricot.util.collection.*; 6 | import org.jetbrains.annotations.*; 7 | 8 | import java.util.*; 9 | 10 | public class CqDeserializer { 11 | private final Map factors = ApricotCollectionFactor.hashMap(); 12 | 13 | @Nullable 14 | public MessageElement deserializer(ApricotServer server, List elements) { 15 | String name = elements.get(0); 16 | if (this.factors.containsKey(name)) { 17 | Map args = ApricotCollectionFactor.hashMap(); 18 | 19 | for (int i = 1;elements.size() > i;i++) { 20 | String content = elements.get(i); 21 | int delimiter = content.indexOf("="); 22 | args.put(content.substring(0, delimiter), content.substring(delimiter + 1)); 23 | } 24 | 25 | return this.factors.get(name) 26 | .create(server, args); 27 | } 28 | return null; 29 | } 30 | 31 | public void register(CqFactor factor) { 32 | this.factors.put(factor.getName(), factor); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/CqFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.server.*; 5 | 6 | import java.util.*; 7 | 8 | public abstract class CqFactor { 9 | public abstract MessageElement create(ApricotServer server, Map args); 10 | 11 | public abstract String getName(); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/at/CqAtFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.at; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.message.element.cq.at.*; 5 | import com.github.cao.awa.apricot.message.element.cq.at.target.*; 6 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | 9 | import java.util.*; 10 | 11 | public class CqAtFactor extends CqFactor { 12 | @Override 13 | public MessageElement create(ApricotServer server, Map args) { 14 | return AtMessageElement.at(AtTarget.of(args.get("qq"))); 15 | } 16 | 17 | @Override 18 | public String getName() { 19 | return "at"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/face/CqFaceFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.face; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.message.element.cq.face.*; 5 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | 8 | import java.util.*; 9 | 10 | public class CqFaceFactor extends CqFactor { 11 | @Override 12 | public MessageElement create(ApricotServer server, Map args) { 13 | return FaceMessageElement.face( 14 | Integer.parseInt(args.get("id")) 15 | ); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return "face"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/forward/CqForwardFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.forward; 2 | 3 | import com.github.cao.awa.apricot.anntations.Stable; 4 | import com.github.cao.awa.apricot.message.element.*; 5 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 6 | import com.github.cao.awa.apricot.message.element.cq.forward.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | 9 | import java.util.*; 10 | 11 | @Stable 12 | public class CqForwardFactor extends CqFactor { 13 | @Override 14 | public MessageElement create(ApricotServer server, Map args) { 15 | return ForwardMessageElement.forward( 16 | args.get("id") 17 | ); 18 | } 19 | 20 | @Override 21 | public String getName() { 22 | return "forward"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/image/CqImageFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.image; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 5 | import com.github.cao.awa.apricot.message.element.cq.image.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | 8 | import java.util.*; 9 | 10 | public class CqImageFactor extends CqFactor { 11 | @Override 12 | public MessageElement create(ApricotServer server, Map args) { 13 | return ImageMessageElement.image( 14 | args.get("file"), 15 | args.get("url"), 16 | args.get("subType") 17 | ); 18 | } 19 | 20 | @Override 21 | public String getName() { 22 | return "image"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/json/CqJsonFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.json; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.message.element.*; 5 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 6 | import com.github.cao.awa.apricot.message.element.cq.json.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | 9 | import java.util.*; 10 | 11 | public class CqJsonFactor extends CqFactor { 12 | @Override 13 | public MessageElement create(ApricotServer server, Map args) { 14 | return args.containsKey("resid") ? JsonMessageElement.json( 15 | JSONObject.parse(args.get("data")), 16 | Integer.parseInt(args.get("resid")) 17 | ) : JsonMessageElement.json(JSONObject.parse(args.get("data"))); 18 | } 19 | 20 | @Override 21 | public String getName() { 22 | return "json"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/poke/CqPokeFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.poke; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 5 | import com.github.cao.awa.apricot.message.element.cq.poke.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | 8 | import java.util.*; 9 | 10 | public class CqPokeFactor extends CqFactor { 11 | @Override 12 | public MessageElement create(ApricotServer server, Map args) { 13 | return PokeMessageElement.poke( 14 | Long.parseLong(args.get("qq")) 15 | ); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return "poke"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/record/CqRecordFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.record; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 5 | import com.github.cao.awa.apricot.message.element.cq.record.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | 8 | import java.util.*; 9 | 10 | public class CqRecordFactor extends CqFactor { 11 | @Override 12 | public MessageElement create(ApricotServer server, Map args) { 13 | return RecordMessageElement.record( 14 | args.get("file"), 15 | args.get("url"), 16 | Boolean.parseBoolean(args.get("magic")) 17 | ); 18 | } 19 | 20 | @Override 21 | public String getName() { 22 | return "record"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/replay/CqReplyFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.replay; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 5 | import com.github.cao.awa.apricot.message.element.cq.replay.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | 8 | import java.util.*; 9 | 10 | public class CqReplyFactor extends CqFactor { 11 | @Override 12 | public MessageElement create(ApricotServer server, Map args) { 13 | return ReplyMessageElement.reply( 14 | Long.parseLong(args.get("id")) 15 | ); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return "reply"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/video/CqVideoFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.video; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 5 | import com.github.cao.awa.apricot.message.element.cq.video.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | 8 | import java.util.*; 9 | 10 | public class CqVideoFactor extends CqFactor { 11 | @Override 12 | public MessageElement create(ApricotServer server, Map args) { 13 | return VideoMessageElement.video( 14 | args.get("file"), 15 | args.get("cover") 16 | ); 17 | } 18 | 19 | @Override 20 | public String getName() { 21 | return "video"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/factor/xml/CqXmlFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.factor.xml; 2 | 3 | import com.github.cao.awa.apricot.message.element.*; 4 | import com.github.cao.awa.apricot.message.element.cq.factor.*; 5 | import com.github.cao.awa.apricot.message.element.cq.xml.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | 8 | import java.util.*; 9 | 10 | public class CqXmlFactor extends CqFactor { 11 | @Override 12 | public MessageElement create(ApricotServer server, Map args) { 13 | return args.containsKey("resid") ? 14 | XmlMessageElement.xml( 15 | args.get("data"), 16 | Integer.parseInt(args.get("resid")) 17 | ) : 18 | XmlMessageElement.xml(args.get("data")); 19 | } 20 | 21 | @Override 22 | public String getName() { 23 | return "xml"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/forward/ForwardMessageElement.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.forward; 2 | 3 | import com.github.cao.awa.apricot.anntations.Stable; 4 | import com.github.cao.awa.apricot.message.element.*; 5 | 6 | @Stable 7 | public class ForwardMessageElement extends MessageElement { 8 | private final String id; 9 | 10 | private ForwardMessageElement(String id) { 11 | this.id = id; 12 | } 13 | 14 | public static ForwardMessageElement forward(String id) { 15 | return new ForwardMessageElement(id); 16 | } 17 | 18 | public String getId() { 19 | return this.id; 20 | } 21 | 22 | @Override 23 | public String toPlainText() { 24 | return "[CQ:forward,id=" + this.id + "]"; 25 | } 26 | 27 | @Override 28 | public String getShortName() { 29 | return "ForwardMessageElement{" + this.id + "}"; 30 | } 31 | 32 | @Override 33 | public boolean shouldIncinerate() { 34 | return true; 35 | } 36 | 37 | public String toString() { 38 | return "ForwardMessageElement{id=" + this.id + "}"; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/poke/PokeMessageElement.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.poke; 2 | 3 | import com.github.cao.awa.apricot.anntations.Stable; 4 | import com.github.cao.awa.apricot.message.element.*; 5 | 6 | @Stable 7 | public class PokeMessageElement extends MessageElement { 8 | private final long target; 9 | 10 | private PokeMessageElement(long target) { 11 | this.target = target; 12 | } 13 | 14 | public static PokeMessageElement poke(long target) { 15 | return new PokeMessageElement(target); 16 | } 17 | 18 | @Override 19 | public String toPlainText() { 20 | return "[CQ:poke,qq=" + this.target + "]"; 21 | } 22 | 23 | @Override 24 | public String getShortName() { 25 | return "PokeMessageElement{target=" + this.target + "}"; 26 | } 27 | 28 | @Override 29 | public boolean shouldIncinerate() { 30 | return true; 31 | } 32 | 33 | public long getTarget() { 34 | return this.target; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/cq/replay/ReplyMessageElement.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.cq.replay; 2 | 3 | import com.github.cao.awa.apricot.anntations.Stable; 4 | import com.github.cao.awa.apricot.message.element.*; 5 | 6 | @Stable 7 | public class ReplyMessageElement extends MessageElement { 8 | private final long messageId; 9 | 10 | private ReplyMessageElement(long messageId) { 11 | this.messageId = messageId; 12 | } 13 | 14 | public static ReplyMessageElement reply(long messageSeq) { 15 | return new ReplyMessageElement(messageSeq); 16 | } 17 | 18 | public long getMessageId() { 19 | return this.messageId; 20 | } 21 | 22 | public String toString() { 23 | return "ReplyMessageElement{id=" + this.messageId + "}"; 24 | } 25 | 26 | @Override 27 | public String toPlainText() { 28 | return "[CQ:reply,id=" + this.messageId + "]"; 29 | } 30 | 31 | @Override 32 | public String getShortName() { 33 | return "ReplyMessageElement{" + this.messageId + "}"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/element/plain/text/TextMessageElement.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.element.plain.text; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.message.element.*; 5 | import org.jetbrains.annotations.*; 6 | 7 | @Stable 8 | public final class TextMessageElement extends MessageElement { 9 | private final @NotNull String text; 10 | 11 | private TextMessageElement(@NotNull String text) { 12 | this.text = text; 13 | } 14 | 15 | public static TextMessageElement text(String text) { 16 | return new TextMessageElement(text); 17 | } 18 | 19 | @NotNull 20 | public String getText() { 21 | return this.text; 22 | } 23 | 24 | public String toString() { 25 | return "TextMessageElement{text=" + this.text + "}"; 26 | } 27 | 28 | @Override 29 | public String toPlainText() { 30 | return this.text; 31 | } 32 | 33 | @Override 34 | public String getShortName() { 35 | return "TextMessageElement{" + this.text + "}"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/forward/ForwardMessage.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.forward; 2 | 3 | import com.alibaba.fastjson2.*; 4 | 5 | public abstract class ForwardMessage { 6 | public abstract void write(JSONObject json); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/forward/dummy/node/DummyForwardNode.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.forward.dummy.node; 2 | 3 | import com.github.cao.awa.apricot.message.forward.dummy.DummyForwardMessage; 4 | 5 | import java.util.function.Consumer; 6 | 7 | public class DummyForwardNode { 8 | private final Object obj; 9 | 10 | public DummyForwardNode(Object obj) { 11 | this.obj = obj; 12 | } 13 | 14 | public void ifMessage(Consumer consumer) { 15 | if (this.obj instanceof DummyForwardMessage message) { 16 | consumer.accept(message); 17 | } 18 | } 19 | 20 | public void ifTree(Consumer consumer) { 21 | if (this.obj instanceof DummyForwardTree message) { 22 | consumer.accept(message); 23 | } 24 | } 25 | 26 | public void forEach(Consumer consumer) { 27 | ifTree(tree -> tree.forEach(node -> node.forEach(consumer))); 28 | ifMessage(consumer); 29 | } 30 | 31 | public void forEach(Consumer inner, Consumer consumer) { 32 | ifTree(tree -> { 33 | inner.accept(tree); 34 | tree.forEach(node -> node.forEach(consumer)); 35 | }); 36 | ifMessage(consumer); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/message/forward/real/RealForwardMessage.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.message.forward.real; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.message.forward.*; 5 | 6 | public class RealForwardMessage extends ForwardMessage { 7 | private final long messageId; 8 | 9 | public RealForwardMessage(long messageId) { 10 | this.messageId = messageId; 11 | } 12 | 13 | public long getMessageId() { 14 | return this.messageId; 15 | } 16 | 17 | public void write(JSONObject json) { 18 | json.fluentPut( 19 | "type", 20 | "node" 21 | ) 22 | .fluentPut( 23 | "data", 24 | new JSONObject().fluentPut( 25 | "id", 26 | this.messageId 27 | ) 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/handler/ApricotBotRequestHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.handler; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.network.dispenser.*; 5 | import com.github.cao.awa.apricot.network.packet.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.meta.lifecycle.ProxyDisconnectPacket; 7 | 8 | @Stable 9 | public class ApricotBotRequestHandler extends RequestHandler { 10 | public ApricotBotRequestHandler(ApricotUniqueDispenser dispenser) { 11 | super(dispenser); 12 | } 13 | 14 | @Override 15 | public void handlePacket(ReadonlyPacket packet) { 16 | if (packet instanceof ProxyDisconnectPacket disconnectPacket) { 17 | getDispenser().disconnect(disconnectPacket.getDisconnectReason()); 18 | } else { 19 | packet.fireEvent( 20 | getDispenser().getServer(), 21 | getDispenser().getRouter() 22 | .getProxy() 23 | ); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/handler/RequestHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.handler; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.network.dispenser.*; 5 | import com.github.cao.awa.apricot.network.packet.*; 6 | 7 | @Stable 8 | public abstract class RequestHandler { 9 | private final ApricotUniqueDispenser dispenser; 10 | 11 | public RequestHandler(ApricotUniqueDispenser dispenser) { 12 | this.dispenser = dispenser; 13 | } 14 | 15 | public ApricotUniqueDispenser getDispenser() { 16 | return this.dispenser; 17 | } 18 | 19 | public abstract void handlePacket(ReadonlyPacket packet); 20 | } -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/lazy/Lazy.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.lazy; 2 | 3 | import com.github.zhuaidadaya.rikaishinikui.handler.universal.receptacle.*; 4 | import org.jetbrains.annotations.*; 5 | 6 | import java.util.function.Supplier; 7 | 8 | /** 9 | * Memoize the supplier result to faster response get. 10 | * 11 | * @param type 12 | * 13 | * @since 1.0.0 14 | * @author 草二号机 15 | */ 16 | public final class Lazy { 17 | private final @NotNull Supplier supplier; 18 | private final Receptacle result = Receptacle.of(); 19 | 20 | public Lazy(@NotNull Supplier delegate) { 21 | this.supplier = delegate; 22 | } 23 | 24 | public T get() { 25 | return this.result.getOrSet(this.supplier); 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/ReadonlyPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet; 2 | 3 | import com.github.cao.awa.apricot.event.target.*; 4 | import com.github.cao.awa.apricot.network.router.*; 5 | import com.github.cao.awa.apricot.server.*; 6 | 7 | /** 8 | * Deserialized packet, unable to rewrite. 9 | *
10 | * see {@link Packet} 11 | * 12 | * @author cao_awa 13 | * @author 草二号机 14 | * @since 1.0.0 15 | */ 16 | public abstract class ReadonlyPacket extends Packet { 17 | /** 18 | * Let an event of this packet be fired. 19 | * 20 | * @param server 21 | * apricot server 22 | * @param proxy 23 | * apricot proxy 24 | * @author 草二号机 25 | * @since 1.0.0 26 | */ 27 | public abstract void fireEvent(ApricotServer server, ApricotProxy proxy); 28 | 29 | public abstract EventTarget target(); 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/ResponsePacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet; 2 | 3 | public abstract class ResponsePacket extends Packet { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/PacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.*; 5 | import com.github.cao.awa.apricot.server.*; 6 | import org.jetbrains.annotations.*; 7 | 8 | public abstract class PacketFactor { 9 | @NotNull 10 | public abstract ReadonlyPacket create(@NotNull ApricotServer server, @NotNull JSONObject request); 11 | 12 | @NotNull 13 | public abstract String getName(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/add/friend/AddFriendReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.add.friend; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.add.friend.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class AddFriendReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull AddFriendReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new AddFriendReceivedPacket( 13 | request.getString("comment"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("time"), 17 | request.getString("flag") 18 | ); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return "request-friend"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/add/group/AddGroupReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.add.group; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.add.group.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class AddGroupReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull AddGroupReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new AddGroupReceivedPacket( 13 | request.getString("comment"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("group_id"), 17 | request.getLong("time"), 18 | request.getString("flag") 19 | ); 20 | } 21 | 22 | @Override 23 | public @NotNull String getName() { 24 | return "request-group-add"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/add/group/InviteGroupReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.add.group; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.add.group.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class InviteGroupReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull InviteGroupReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new InviteGroupReceivedPacket( 13 | request.getString("comment"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("group_id"), 17 | request.getLong("time"), 18 | request.getString("flag") 19 | ); 20 | } 21 | 22 | @Override 23 | public @NotNull String getName() { 24 | return "request-group-invite"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/invalid/InvalidDataReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.invalid; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.invalid.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class InvalidDataReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull InvalidDataReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new InvalidDataReceivedPacket( 13 | request, 14 | false 15 | ); 16 | } 17 | 18 | @Override 19 | public @NotNull String getName() { 20 | return "invalid-data"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/member/change/decrease/bot/BotDiedFromGroupPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.member.change.decrease.bot; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.member.change.decrease.bot.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class BotDiedFromGroupPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull BotDiedFromGroupPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new BotDiedFromGroupPacket( 13 | request.getLong("operator_id"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("group_id"), 17 | request.getLong("time") 18 | ); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return "notice-group-decrease-kick-me"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/member/change/decrease/kick/GroupMemberLeavedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.member.change.decrease.kick; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.member.change.decrease.leave.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class GroupMemberLeavedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull GroupMemberLeavedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new GroupMemberLeavedPacket( 13 | request.getLong("operator_id"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("group_id"), 17 | request.getLong("time") 18 | ); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return "notice-group-decrease-leave"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/member/change/decrease/leave/GroupMemberKickedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.member.change.decrease.leave; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.member.change.decrease.kick.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class GroupMemberKickedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull GroupMemberKickedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new GroupMemberKickedPacket( 13 | request.getLong("operator_id"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("group_id"), 17 | request.getLong("time") 18 | ); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return "notice-group-decrease-kick"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/member/change/increase/approve/GroupMemberApprovedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.member.change.increase.approve; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.member.change.increase.approve.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class GroupMemberApprovedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull GroupMemberApprovedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new GroupMemberApprovedPacket( 13 | request.getLong("operator_id"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("group_id"), 17 | request.getLong("time") 18 | ); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return "notice-group-increase-approve"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/member/change/increase/invite/GroupMemberInvitedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.member.change.increase.invite; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.member.change.increase.invite.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class GroupMemberInvitedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull GroupMemberInvitedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new GroupMemberInvitedPacket( 13 | request.getLong("operator_id"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("group_id"), 17 | request.getLong("time") 18 | ); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return "notice-group-increase-invite"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/message/group/received/GroupAnonymousMessagePacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.message.group.received; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.group.received.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.sender.anonymous.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | import com.github.cao.awa.apricot.util.message.*; 9 | import org.jetbrains.annotations.*; 10 | 11 | public class GroupAnonymousMessagePacketFactor extends PacketFactor { 12 | @Override 13 | public @NotNull GroupAnonymousMessageReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 14 | return new GroupAnonymousMessageReceivedPacket( 15 | MessageUtil.process( 16 | server, 17 | request.getString("message") 18 | ), 19 | request.getLong("self_id"), 20 | AnonymousMessageSender.create(request.getJSONObject("anonymous"), request.getJSONObject("sender")), 21 | request.getLong("group_id"), 22 | request.getLong("time"), 23 | request.getLong("message_seq"), 24 | request.getLong("message_id") 25 | ); 26 | } 27 | 28 | @Override 29 | public @NotNull String getName() { 30 | return "message-group-anonymous"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/message/group/received/GroupNormalMessagePacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.message.group.received; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.group.received.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.sender.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | import com.github.cao.awa.apricot.util.message.*; 9 | import org.jetbrains.annotations.*; 10 | 11 | public class GroupNormalMessagePacketFactor extends PacketFactor { 12 | @Override 13 | public @NotNull GroupNormalMessageReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 14 | return new GroupNormalMessageReceivedPacket( 15 | MessageUtil.process( 16 | server, 17 | request.getString("message") 18 | ), 19 | request.getLong("self_id"), 20 | GroupMessageSender.create(request.getJSONObject("sender")), 21 | request.getLong("group_id"), 22 | request.getLong("time"), 23 | request.getLong("message_seq"), 24 | request.getLong("message_id") 25 | ); 26 | } 27 | 28 | @Override 29 | public @NotNull String getName() { 30 | return "message-group-normal"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/message/group/sent/GroupAnonymousSentMessagePacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.message.group.sent; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.group.sent.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.sender.anonymous.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | import com.github.cao.awa.apricot.util.message.*; 9 | import org.jetbrains.annotations.*; 10 | 11 | public class GroupAnonymousSentMessagePacketFactor extends PacketFactor { 12 | @Override 13 | public @NotNull GroupAnonymousMessageSentPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 14 | return new GroupAnonymousMessageSentPacket( 15 | MessageUtil.process( 16 | server, 17 | request.getString("message") 18 | ), 19 | request.getLong("self_id"), 20 | AnonymousMessageSender.create(request.getJSONObject("anonymous"), request.getJSONObject("sender")), 21 | request.getLong("group_id"), 22 | request.getLong("time"), 23 | request.getLong("message_seq"), 24 | request.getLong("message_id") 25 | ); 26 | } 27 | 28 | @Override 29 | public @NotNull String getName() { 30 | return "message-sent-group-anonymous"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/message/group/sent/GroupNormalMessageSentPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.message.group.sent; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.group.sent.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.sender.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | import com.github.cao.awa.apricot.util.message.*; 9 | import org.jetbrains.annotations.*; 10 | 11 | public class GroupNormalMessageSentPacketFactor extends PacketFactor { 12 | @Override 13 | public @NotNull GroupNormalMessageSentPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 14 | return new GroupNormalMessageSentPacket( 15 | MessageUtil.process( 16 | server, 17 | request.getString("message") 18 | ), 19 | request.getLong("self_id"), 20 | GroupMessageSender.create(request.getJSONObject("sender")), 21 | request.getLong("group_id"), 22 | request.getLong("time"), 23 | request.getLong("message_seq"), 24 | request.getLong("message_id") 25 | ); 26 | } 27 | 28 | @Override 29 | public @NotNull String getName() { 30 | return "message-sent-group-normal"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/message/personal/received/PrivateTemporaryMessageReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.message.personal.received; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.personal.received.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.sender.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | import com.github.cao.awa.apricot.util.message.*; 9 | import org.jetbrains.annotations.*; 10 | 11 | public class PrivateTemporaryMessageReceivedPacketFactor extends PacketFactor { 12 | @Override 13 | public @NotNull PrivateTemporaryMessageReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 14 | return new PrivateTemporaryMessageReceivedPacket( 15 | MessageUtil.process( 16 | server, 17 | request.getString("message") 18 | ), 19 | request.getLong("self_id"), 20 | PrivateMessageSender.create(request.getJSONObject("sender")), 21 | request.getLong("user_id"), 22 | request.getLong("time"), 23 | request.getLong("message_seq"), 24 | request.getLong("message_id") 25 | ); 26 | } 27 | 28 | @Override 29 | public @NotNull String getName() { 30 | return "message-private-group"; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/message/recall/gruop/GroupMessageRecallPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.message.recall.gruop; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.recall.group.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class GroupMessageRecallPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull GroupMessageRecallPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new GroupMessageRecallPacket( 13 | request.getLong("self_id"), 14 | request.getLong("user_id"), 15 | request.getLong("time"), 16 | request.getLong("operator_id"), 17 | request.getLong("group_id"), 18 | request.getInteger("message_id") 19 | ); 20 | } 21 | 22 | @Override 23 | public @NotNull String getName() { 24 | return "notice-group-recall"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/message/recall/personal/PrivateMessageRecallPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.message.recall.personal; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.recall.personal.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class PrivateMessageRecallPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull PrivateMessageRecallPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new PrivateMessageRecallPacket( 13 | request.getLong("self_id"), 14 | request.getLong("user_id"), 15 | request.getLong("time"), 16 | request.getInteger("message_id") 17 | ); 18 | } 19 | 20 | @Override 21 | public @NotNull String getName() { 22 | return "notice-friend-recall"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/meta/lifecycle/ProxyConnectPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.meta.lifecycle; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.meta.lifecycle.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class ProxyConnectPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull ProxyConnectPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new ProxyConnectPacket( 13 | request.getLong("self_id"), 14 | request.getLong("time") 15 | ); 16 | } 17 | 18 | @Override 19 | public @NotNull String getName() { 20 | return "meta-lifecycle-connect"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/meta/lifecycle/ProxyDisconnectPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.meta.lifecycle; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.meta.lifecycle.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class ProxyDisconnectPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull ProxyDisconnectPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new ProxyDisconnectPacket( 13 | request.getString("disconnect_reason"), 14 | request.getLong("proxy_id"), 15 | request.getLong("connect_time") 16 | ); 17 | } 18 | 19 | @Override 20 | public @NotNull String getName() { 21 | return "meta-lifecycle-disconnect"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/mute/issue/IssueGroupMuteReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.mute.issue; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.*; 5 | import com.github.cao.awa.apricot.network.packet.factor.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class IssueGroupMuteReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull ReadonlyPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return request.getLong("user_id") == 0 ? 13 | server.createPacket( 14 | "notice-group-ban-all", 15 | request 16 | ) : 17 | server.createPacket( 18 | "notice-group-ban-personal", 19 | request 20 | ); 21 | } 22 | 23 | @Override 24 | public @NotNull String getName() { 25 | return "notice-group-ban-ban"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/mute/issue/all/IssueGroupAllMuteReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.mute.issue.all; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.mute.issue.all.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class IssueGroupAllMuteReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull IssueGroupAllMuteReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new IssueGroupAllMuteReceivedPacket( 13 | request.getLong("self_id"), 14 | request.getLong("group_id"), 15 | request.getLong("operator_id"), 16 | request.getLong("time") 17 | ); 18 | } 19 | 20 | @Override 21 | public @NotNull String getName() { 22 | return "notice-group-ban-all"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/mute/issue/personal/IssueGroupPersonalMuteReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.mute.issue.personal; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.mute.issue.personal.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class IssueGroupPersonalMuteReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull IssueGroupPersonalMuteReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new IssueGroupPersonalMuteReceivedPacket( 13 | request.getLong("self_id"), 14 | request.getLong("user_id"), 15 | request.getLong("group_id"), 16 | request.getLong("operator_id"), 17 | request.getLong("time"), 18 | request.getLong("duration") 19 | ); 20 | } 21 | 22 | @Override 23 | public @NotNull String getName() { 24 | return "notice-group-ban-personal"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/mute/lift/LiftGroupMuteReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.mute.lift; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.*; 5 | import com.github.cao.awa.apricot.network.packet.factor.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class LiftGroupMuteReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull ReadonlyPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return request.getLong("user_id") == 0 ? 13 | server.createPacket( 14 | "notice-group-lift-all", 15 | request 16 | ) : 17 | server.createPacket( 18 | "notice-group-lift-personal", 19 | request 20 | ); 21 | } 22 | 23 | @Override 24 | public @NotNull String getName() { 25 | return "notice-group-ban-lift-ban"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/mute/lift/all/LiftGroupAllMuteReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.mute.lift.all; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.mute.lift.all.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class LiftGroupAllMuteReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull LiftGroupAllMuteReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new LiftGroupAllMuteReceivedPacket( 13 | request.getLong("self_id"), 14 | request.getLong("group_id"), 15 | request.getLong("operator_id"), 16 | request.getLong("time") 17 | ); 18 | } 19 | 20 | @Override 21 | public @NotNull String getName() { 22 | return "notice-group-lift-all"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/mute/lift/personal/LiftGroupPersonalMuteReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.mute.lift.personal; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.mute.lift.personal.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class LiftGroupPersonalMuteReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull LiftGroupPersonalMuteReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new LiftGroupPersonalMuteReceivedPacket( 13 | request.getLong("self_id"), 14 | request.getLong("user_id"), 15 | request.getLong("group_id"), 16 | request.getLong("operator_id"), 17 | request.getLong("time") 18 | ); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return "notice-group-lift-personal"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/name/card/GroupNameChangedReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.name.card; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.name.card.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class GroupNameChangedReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull GroupNameCardChangedReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new GroupNameCardChangedReceivedPacket( 13 | request.getString("card_old"), 14 | request.getString("card_new"), 15 | request.getLong("self_id"), 16 | request.getLong("user_id"), 17 | request.getLong("group_id"), 18 | request.getLong("time") 19 | ); 20 | } 21 | 22 | @Override 23 | public @NotNull String getName() { 24 | return "notice-group-card"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/name/title/GroupTitleChangedReceivedPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.name.title; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.name.title.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class GroupTitleChangedReceivedPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull GroupTitleChangedReceivedPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new GroupTitleChangedReceivedPacket( 13 | request.getString("title"), 14 | request.getLong("self_id"), 15 | request.getLong("user_id"), 16 | request.getLong("group_id"), 17 | request.getLong("time") 18 | ); 19 | } 20 | 21 | @Override 22 | public @NotNull String getName() { 23 | return "notice-notify-title"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/factor/response/EchoResultPacketFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.factor.response; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.factor.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.response.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | public class EchoResultPacketFactor extends PacketFactor { 10 | @Override 11 | public @NotNull EchoResultPacket create(@NotNull ApricotServer server, @NotNull JSONObject request) { 12 | return new EchoResultPacket( 13 | request.getJSONObject("echo").getString("id"), 14 | request 15 | ); 16 | } 17 | 18 | @Override 19 | public @NotNull String getName() { 20 | return "echo-result"; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/member/change/GroupMemberChangedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.member.change; 2 | 3 | import com.github.cao.awa.apricot.network.packet.*; 4 | 5 | public abstract class GroupMemberChangedPacket extends ReadonlyPacket { 6 | public abstract long getOperatorId(); 7 | 8 | public abstract long getBotId(); 9 | 10 | public abstract long getUserId(); 11 | 12 | public abstract long getGroupId(); 13 | 14 | public abstract long getTimestamp(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/member/change/decrease/GroupMemberDecreasedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.member.change.decrease; 2 | 3 | import com.github.cao.awa.apricot.network.packet.receive.member.change.*; 4 | 5 | public abstract class GroupMemberDecreasedPacket extends GroupMemberChangedPacket { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/member/change/increase/GroupMemberIncreasedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.member.change.increase; 2 | 3 | import com.github.cao.awa.apricot.approval.group.*; 4 | import com.github.cao.awa.apricot.network.packet.receive.member.change.*; 5 | 6 | public abstract class GroupMemberIncreasedPacket extends GroupMemberChangedPacket { 7 | public abstract ApprovalType getType(); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/MessagePacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message; 2 | 3 | import com.github.cao.awa.apricot.message.*; 4 | import com.github.cao.awa.apricot.message.assemble.*; 5 | import com.github.cao.awa.apricot.network.packet.*; 6 | import com.github.cao.awa.apricot.network.packet.receive.message.sender.*; 7 | import com.github.cao.awa.apricot.util.time.TimeUtil; 8 | 9 | public abstract class MessagePacket extends ReadonlyPacket { 10 | private final long ownId = TimeUtil.nanoId(); 11 | 12 | public abstract IgnoredIdMessageSender getSender(); 13 | 14 | public abstract AssembledMessage getMessage(); 15 | 16 | public abstract long getSenderId(); 17 | 18 | public abstract long getResponseId(); 19 | 20 | public abstract long getTimestamp(); 21 | 22 | public abstract long getMessageSeq(); 23 | 24 | public abstract long getMessageId(); 25 | 26 | public abstract long getBotId(); 27 | 28 | public abstract MessageType getType(); 29 | 30 | public long getOwnId() { 31 | return this.ownId; 32 | } 33 | 34 | public abstract long getTargetId(); 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/MessageReceivedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message; 2 | 3 | public abstract class MessageReceivedPacket extends MessagePacket { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/MessageSentPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message; 2 | 3 | public abstract class MessageSentPacket extends MessagePacket { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/group/received/GroupMessageReceivedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.group.received; 2 | 3 | import com.github.cao.awa.apricot.event.target.*; 4 | import com.github.cao.awa.apricot.message.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.*; 6 | import com.github.cao.awa.apricot.util.time.*; 7 | 8 | public abstract class GroupMessageReceivedPacket extends MessageReceivedPacket { 9 | @Override 10 | public MessageType getType() { 11 | return MessageType.GROUP; 12 | } 13 | 14 | @Override 15 | public EventTarget target() { 16 | return new EventTarget( 17 | getGroupId(), 18 | getSenderId(), 19 | getBotId() 20 | ); 21 | } 22 | 23 | public abstract long getGroupId(); 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/group/sent/GroupMessageSentPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.group.sent; 2 | 3 | import com.github.cao.awa.apricot.event.target.*; 4 | import com.github.cao.awa.apricot.message.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.*; 6 | import com.github.cao.awa.apricot.util.time.*; 7 | 8 | public abstract class GroupMessageSentPacket extends MessageSentPacket { 9 | @Override 10 | public MessageType getType() { 11 | return MessageType.GROUP; 12 | } 13 | 14 | @Override 15 | public EventTarget target() { 16 | return new EventTarget( 17 | getGroupId(), 18 | getSenderId(), 19 | getBotId() 20 | ); 21 | } 22 | 23 | public abstract long getGroupId(); 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/personal/received/PrivateMessageReceivedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.personal.received; 2 | 3 | import com.github.cao.awa.apricot.event.target.*; 4 | import com.github.cao.awa.apricot.message.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.*; 6 | import com.github.cao.awa.apricot.util.time.*; 7 | 8 | public abstract class PrivateMessageReceivedPacket extends MessageReceivedPacket { 9 | @Override 10 | public MessageType getType() { 11 | return MessageType.PRIVATE; 12 | } 13 | 14 | @Override 15 | public EventTarget target() { 16 | return new EventTarget( 17 | - 1, 18 | getSenderId(), 19 | getBotId() 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/personal/sent/PrivateMessageSentPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.personal.sent; 2 | 3 | import com.github.cao.awa.apricot.event.target.*; 4 | import com.github.cao.awa.apricot.message.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.message.*; 6 | import com.github.cao.awa.apricot.util.time.*; 7 | 8 | public abstract class PrivateMessageSentPacket extends MessageSentPacket { 9 | @Override 10 | public MessageType getType() { 11 | return MessageType.PRIVATE; 12 | } 13 | 14 | @Override 15 | public EventTarget target() { 16 | return new EventTarget( 17 | - 1, 18 | getSenderId(), 19 | getBotId() 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/recall/MessageRecallPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.recall; 2 | 3 | import com.github.cao.awa.apricot.message.*; 4 | import com.github.cao.awa.apricot.network.packet.*; 5 | 6 | public abstract class MessageRecallPacket extends ReadonlyPacket { 7 | public abstract MessageType getType(); 8 | 9 | public abstract long getMessageId(); 10 | 11 | public abstract long getTimestamp(); 12 | 13 | public abstract long getBotId(); 14 | 15 | public abstract long getResponseId(); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/sender/BasicMessageSender.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.sender; 2 | 3 | public class BasicMessageSender implements MessageSender { 4 | private final long senderId; 5 | private final String nickname; 6 | 7 | public BasicMessageSender(long senderId, String nickname) { 8 | this.senderId = senderId; 9 | this.nickname = nickname; 10 | } 11 | 12 | public BasicMessageSender(long senderId) { 13 | this.senderId = senderId; 14 | this.nickname = ""; 15 | } 16 | 17 | public String getNickname() { 18 | return this.nickname; 19 | } 20 | 21 | @Override 22 | public long getSenderId() { 23 | return this.senderId; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/sender/GuildMessageSender.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.sender; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Unsupported 6 | public class GuildMessageSender implements IgnoredIdMessageSender { 7 | @Override 8 | public int getAge() { 9 | return 0; 10 | } 11 | 12 | @Override 13 | public String getName() { 14 | return ""; 15 | } 16 | 17 | @Override 18 | public String getSex() { 19 | return ""; 20 | } 21 | 22 | @Override 23 | public long getUserId() { 24 | return -1; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/sender/IgnoredIdMessageSender.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.sender; 2 | 3 | public interface IgnoredIdMessageSender extends MessageSender { 4 | int getAge(); 5 | 6 | String getName(); 7 | 8 | String getSex(); 9 | 10 | long getUserId(); 11 | 12 | @Override 13 | default long getSenderId() { 14 | return - 1; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/sender/MessageSender.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.sender; 2 | 3 | public interface MessageSender { 4 | public long getSenderId(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/sender/PrivateMessageSender.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.sender; 2 | 3 | import com.alibaba.fastjson2.*; 4 | 5 | public class PrivateMessageSender implements IgnoredIdMessageSender { 6 | private final int age; 7 | private final String name; 8 | private final String sex; 9 | private final long userId; 10 | 11 | public PrivateMessageSender(int age, String name, String sex, long userId) { 12 | this.age = age; 13 | this.name = name; 14 | this.sex = sex; 15 | this.userId = userId; 16 | } 17 | 18 | public static PrivateMessageSender create(JSONObject json) { 19 | return new PrivateMessageSender( 20 | json.getInteger("age"), 21 | json.getString("nickname"), 22 | json.getString("sex"), 23 | json.getLong("user_id") 24 | ); 25 | } 26 | 27 | public int getAge() { 28 | return this.age; 29 | } 30 | 31 | public String getName() { 32 | return this.name; 33 | } 34 | 35 | public String getSex() { 36 | return this.sex; 37 | } 38 | 39 | public long getUserId() { 40 | return this.userId; 41 | } 42 | } 43 | 44 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/message/sender/anonymous/Anonymous.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.message.sender.anonymous; 2 | 3 | import com.alibaba.fastjson2.*; 4 | 5 | public class Anonymous { 6 | private final String name; 7 | private final String flag; 8 | private final long id; 9 | 10 | public Anonymous(String name, String flag, long id) { 11 | this.name = name; 12 | this.flag = flag; 13 | this.id = id; 14 | } 15 | 16 | public static Anonymous create(JSONObject anonymous) { 17 | return new Anonymous( 18 | anonymous.getString("name"), 19 | anonymous.getString("flag"), 20 | anonymous.getLong("id") 21 | ); 22 | } 23 | 24 | public String getName() { 25 | return this.name; 26 | } 27 | 28 | public String getFlag() { 29 | return this.flag; 30 | } 31 | 32 | public long getId() { 33 | return this.id; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/meta/lifecycle/ProxyConnectPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.meta.lifecycle; 2 | 3 | import com.github.cao.awa.apricot.event.receive.lifecycle.*; 4 | import com.github.cao.awa.apricot.event.target.*; 5 | import com.github.cao.awa.apricot.network.packet.*; 6 | import com.github.cao.awa.apricot.network.router.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | 9 | public class ProxyConnectPacket extends ReadonlyPacket { 10 | private final long id; 11 | private final long timestamp; 12 | 13 | public ProxyConnectPacket(long id, long timestamp) { 14 | this.id = id; 15 | this.timestamp = timestamp; 16 | } 17 | 18 | public long getId() { 19 | return this.id; 20 | } 21 | 22 | public long getTimestamp() { 23 | return this.timestamp; 24 | } 25 | 26 | /** 27 | * Let an event of this packet be fired. 28 | * 29 | * @param server 30 | * apricot server 31 | * @param proxy 32 | * apricot proxy 33 | * @author 草二号机 34 | * @since 1.0.0 35 | */ 36 | @Override 37 | public void fireEvent(ApricotServer server, ApricotProxy proxy) { 38 | server.fireEvent(new ProxyConnectEvent( 39 | proxy, 40 | this 41 | )); 42 | } 43 | 44 | @Override 45 | public EventTarget target() { 46 | return new EventTarget(-1, -1, this.id); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/mute/issue/IssueGroupMuteReceivedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.mute.issue; 2 | 3 | import com.github.cao.awa.apricot.network.packet.*; 4 | 5 | public abstract class IssueGroupMuteReceivedPacket extends ReadonlyPacket { 6 | public long getDuration() { 7 | return - 1; 8 | } 9 | 10 | public long getUserId() { 11 | return 0; 12 | } 13 | 14 | public abstract long getGroupId(); 15 | 16 | public abstract long getBotId(); 17 | 18 | public abstract long getOperatorId(); 19 | 20 | public abstract long getTimestamp(); 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/mute/lift/LiftGroupMuteReceivedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.mute.lift; 2 | 3 | import com.github.cao.awa.apricot.network.packet.*; 4 | 5 | public abstract class LiftGroupMuteReceivedPacket extends ReadonlyPacket { 6 | public long getUserId() { 7 | return 0; 8 | } 9 | 10 | public abstract long getGroupId(); 11 | 12 | public abstract long getBotId(); 13 | 14 | public abstract long getOperatorId(); 15 | 16 | public abstract long getTimestamp(); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/poke/PokeReceivedPacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.poke; 2 | 3 | import com.github.cao.awa.apricot.message.*; 4 | import com.github.cao.awa.apricot.network.packet.*; 5 | 6 | public abstract class PokeReceivedPacket extends ReadonlyPacket { 7 | public abstract MessageType getType(); 8 | 9 | public abstract long getCauserId(); 10 | 11 | public abstract long getBotId(); 12 | 13 | public abstract long getTargetId(); 14 | 15 | public abstract long getResponseId(); 16 | 17 | public abstract long getTimestamp(); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/response/NoResponsePacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.response; 2 | 3 | import com.github.cao.awa.apricot.network.packet.*; 4 | 5 | public class NoResponsePacket extends ResponsePacket { 6 | public static final NoResponsePacket NO_RESPONSE = new NoResponsePacket(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/response/forward/GetForwardMessageResponsePacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.response.forward; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.anntations.*; 5 | import com.github.cao.awa.apricot.message.forward.dummy.node.DummyForwardTree; 6 | import com.github.cao.awa.apricot.network.packet.*; 7 | import com.github.cao.awa.apricot.server.*; 8 | 9 | @Unsupported({"TIMESTAMP"}) 10 | public class GetForwardMessageResponsePacket extends ResponsePacket { 11 | private final DummyForwardTree messages; 12 | 13 | public GetForwardMessageResponsePacket(DummyForwardTree messages) { 14 | this.messages = messages; 15 | } 16 | 17 | public DummyForwardTree getMessages() { 18 | return this.messages; 19 | } 20 | 21 | public static GetForwardMessageResponsePacket create(ApricotServer server, JSONObject json) { 22 | return new GetForwardMessageResponsePacket(DummyForwardTree.create(server, json)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/packet/receive/response/message/SendMessageResponsePacket.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.packet.receive.response.message; 2 | 3 | import com.alibaba.fastjson2.*; 4 | import com.github.cao.awa.apricot.network.packet.*; 5 | 6 | public class SendMessageResponsePacket extends ResponsePacket { 7 | private final long messageId; 8 | 9 | public SendMessageResponsePacket(long messageId) { 10 | this.messageId = messageId; 11 | } 12 | 13 | public static SendMessageResponsePacket create(JSONObject json) { 14 | try { 15 | return new SendMessageResponsePacket(json.getLong("message_id")); 16 | } catch (Exception e) { 17 | return new SendMessageResponsePacket(0); 18 | } 19 | } 20 | 21 | public long getMessageId() { 22 | return messageId; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/network/router/NetworkRouter.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.network.router; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.server.*; 5 | import io.netty.channel.*; 6 | import io.netty.handler.codec.http.websocketx.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | @Stable 10 | public abstract class NetworkRouter extends SimpleChannelInboundHandler { 11 | private final @NotNull ApricotServer server; 12 | 13 | public final @NotNull ApricotServer getServer() { 14 | return this.server; 15 | } 16 | 17 | public NetworkRouter(@NotNull ApricotServer server) { 18 | this.server = server; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/ext/captcha/CaptchaPlugin.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.captcha; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.plugin.*; 5 | import com.github.cao.awa.apricot.plugin.ext.captcha.handler.*; 6 | import com.github.cao.awa.apricot.plugin.name.*; 7 | import org.jetbrains.annotations.*; 8 | 9 | @AutoPlugin 10 | public class CaptchaPlugin extends Plugin { 11 | public static final CaptchaWithPrivate CAPTCHA_WITH_PRIVATE = new CaptchaWithPrivate(); 12 | public static final CaptchaWithGroup CAPTCHA_WITH_GROUP = new CaptchaWithGroup(); 13 | public static final CaptchaChecker CAPTCHA_CHECKER = new CaptchaChecker(); 14 | public static final CaptchaPass CAPTCHA_PASS = new CaptchaPass(); 15 | 16 | @Override 17 | public @NotNull PluginName name() { 18 | return PluginName.of( 19 | "Captcha", 20 | "Captcha" 21 | ); 22 | } 23 | 24 | @Override 25 | public void initialize() { 26 | registerHandler(new JoinGroupCaptcha()); 27 | registerHandler(new LeaveGroupCaptcha()); 28 | registerHandler(CAPTCHA_WITH_GROUP); 29 | registerHandler(CAPTCHA_WITH_PRIVATE); 30 | registerHandler(CAPTCHA_PASS); 31 | } 32 | 33 | @Override 34 | public String version() { 35 | return "1.0.2"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/ext/captcha/handler/LeaveGroupCaptcha.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.captcha.handler; 2 | 3 | import com.github.cao.awa.apricot.event.handler.member.change.decrease.*; 4 | import com.github.cao.awa.apricot.event.receive.member.change.decrease.*; 5 | 6 | import static com.github.cao.awa.apricot.plugin.ext.captcha.CaptchaPlugin.*; 7 | 8 | public class LeaveGroupCaptcha extends GroupMemberDecreasedEventHandler { 9 | /** 10 | * Process event. 11 | * 12 | * @param event 13 | * event 14 | * @author cao_awa 15 | * @author 草二号机 16 | * @since 1.0.0 17 | */ 18 | @Override 19 | public void onDecrease(GroupMemberDecreasedEvent event) { 20 | CAPTCHA_CHECKER.reset(event.getPacket() 21 | .target()); 22 | event.proxy() 23 | .server() 24 | .getEventManager() 25 | .release(event.getPacket() 26 | .target()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/ext/example/ExamplePlugin.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.example; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.plugin.*; 5 | import com.github.cao.awa.apricot.plugin.ext.example.disinformation.*; 6 | import com.github.cao.awa.apricot.plugin.ext.example.forward.*; 7 | import com.github.cao.awa.apricot.plugin.name.*; 8 | import org.jetbrains.annotations.*; 9 | 10 | import java.util.*; 11 | 12 | @AutoPlugin 13 | public class ExamplePlugin extends Plugin { 14 | private static final UUID ID = UUID.fromString("8e599f58-703f-4dc9-beb8-abee377fb39b"); 15 | 16 | @Override 17 | public UUID uuid() { 18 | return ID; 19 | } 20 | 21 | @Override 22 | public @NotNull PluginName name() { 23 | return PluginName.of( 24 | "Example", 25 | "生草机-示例" 26 | ); 27 | } 28 | 29 | @Override 30 | public void initialize() { 31 | // registerHandler(new DrawTest()); 32 | registerHandler(new Disinformation()); 33 | registerHandler(new CqCodeReproduce()); 34 | registerHandler(new ForwardGetTest()); 35 | } 36 | 37 | @Override 38 | public String version() { 39 | return "1.0.1"; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/ext/grass/GrassPlugin.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.grass; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.plugin.*; 5 | import com.github.cao.awa.apricot.plugin.ext.grass.handler.delete.*; 6 | import com.github.cao.awa.apricot.plugin.ext.grass.handler.hitokoto.*; 7 | import com.github.cao.awa.apricot.plugin.ext.grass.handler.mute.*; 8 | import com.github.cao.awa.apricot.plugin.ext.grass.handler.response.*; 9 | import com.github.cao.awa.apricot.plugin.name.*; 10 | import org.jetbrains.annotations.*; 11 | 12 | /** 13 | * The "草二号机" plugin for chatting. 14 | * 15 | * @author cao_awa 16 | * @author 草二号机 17 | */ 18 | @AutoPlugin 19 | public class GrassPlugin extends Plugin { 20 | @Override 21 | public @NotNull PluginName name() { 22 | return PluginName.of( 23 | "Grass", 24 | "草二号机" 25 | ); 26 | } 27 | 28 | @Override 29 | public void initialize() { 30 | registerHandler(new QuickResponse()); 31 | registerHandler(new MuteMe()); 32 | registerHandler(new Hitokoto()); 33 | registerHandler(new FastDelete()); 34 | } 35 | 36 | @Override 37 | public String version() { 38 | return "1.0.0"; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/ext/grass/handler/response/QuickResponse.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.grass.handler.response; 2 | 3 | import com.github.cao.awa.apricot.event.handler.message.received.group.*; 4 | import com.github.cao.awa.apricot.event.receive.message.group.received.*; 5 | import com.github.cao.awa.apricot.message.assemble.AssembledMessage; 6 | import com.github.cao.awa.apricot.message.element.plain.text.TextMessageElement; 7 | import com.github.cao.awa.apricot.network.packet.receive.message.group.received.GroupMessageReceivedPacket; 8 | import com.github.cao.awa.apricot.network.packet.send.message.SendMessagePacket; 9 | import com.github.cao.awa.apricot.network.router.ApricotProxy; 10 | 11 | public class QuickResponse extends GroupMessageReceivedEventHandler { 12 | @Override 13 | public void onMessageReceived(GroupMessageReceivedEvent event) { 14 | // GroupMessageReceivedPacket packet = event.getPacket(); 15 | // ApricotProxy proxy = event.getProxy(); 16 | // 17 | // proxy.send(new SendMessagePacket( 18 | // packet.getType(), 19 | // new AssembledMessage().participate(new TextMessageElement("www")), 20 | // packet.getResponseId() 21 | // )); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/ext/lawn/Lawn.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.lawn; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.plugin.*; 5 | import com.github.cao.awa.apricot.plugin.ext.lawn.handler.*; 6 | import com.github.cao.awa.apricot.plugin.ext.lawn.handler.media.MediaDownload; 7 | import com.github.cao.awa.apricot.plugin.ext.lawn.handler.message.export.MessageExport; 8 | import com.github.cao.awa.apricot.plugin.ext.lawn.handler.message.recall.reproduce.*; 9 | import com.github.cao.awa.apricot.plugin.ext.lawn.handler.reload.*; 10 | import com.github.cao.awa.apricot.plugin.name.*; 11 | import org.jetbrains.annotations.*; 12 | 13 | @AutoPlugin 14 | public class Lawn extends Plugin { 15 | @Override 16 | public @NotNull PluginName name() { 17 | return PluginName.of( 18 | "Lawn", 19 | "生草机" 20 | ); 21 | } 22 | 23 | @Override 24 | public void initialize() { 25 | // Features handlers. 26 | // registerHandler(new Tests()); 27 | registerHandler(new ApricotInformation()); 28 | registerHandler(new PokeReciprocity()); 29 | registerHandler(new MessageExport()); 30 | // registerHandler(new RecallNotice()); 31 | registerHandler(new MessageReproducer()); 32 | registerHandler(new Reloading()); 33 | registerHandler(new MediaDownload()); 34 | } 35 | 36 | @Override 37 | public String version() { 38 | return "1.0.2"; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/ext/lawn/handler/PokeReciprocity.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.ext.lawn.handler; 2 | 3 | import com.github.cao.awa.apricot.event.handler.poke.*; 4 | import com.github.cao.awa.apricot.event.receive.poke.*; 5 | import com.github.cao.awa.apricot.network.packet.receive.poke.*; 6 | import com.github.cao.awa.apricot.network.packet.send.poke.*; 7 | import com.github.cao.awa.apricot.network.router.*; 8 | import com.github.cao.awa.apricot.task.intensive.*; 9 | 10 | public class PokeReciprocity extends PokeReceivedEventHandler { 11 | /** 12 | * Process event. 13 | * 14 | * @param event 15 | * event 16 | * @author cao_awa 17 | * @author 草二号机 18 | * @since 1.0.0 19 | */ 20 | @Override 21 | public void onPoke(PokeReceivedEvent event) { 22 | PokeReceivedPacket packet = event.getPacket(); 23 | ApricotProxy proxy = event.proxy(); 24 | if (packet.getTargetId() == packet.getBotId() && ! (packet.getCauserId() == packet.getBotId())) { 25 | proxy.echo(new SendPokePacket( 26 | packet.getType(), 27 | packet.getCauserId(), 28 | packet.getBotId(), 29 | packet.getResponseId() 30 | )); 31 | } 32 | } 33 | 34 | /** 35 | * The poke reciprocity is intensive IO. 36 | * 37 | * @return Intensive 38 | */ 39 | @Override 40 | public IntensiveType intensiveType() { 41 | return IntensiveType.IO; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/internal/bus/handlers/BusHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.internal.bus.handlers; 2 | 3 | import com.github.cao.awa.apricot.event.receive.*; 4 | 5 | import java.util.function.*; 6 | 7 | public interface BusHandler> { 8 | void register(Consumer action); 9 | 10 | void unregister(Consumer action); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/internal/bus/handlers/message/MessageBus.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.internal.bus.handlers.message; 2 | 3 | import com.github.cao.awa.apricot.event.handler.message.*; 4 | import com.github.cao.awa.apricot.event.receive.message.*; 5 | import com.github.cao.awa.apricot.plugin.internal.bus.handlers.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import com.github.cao.awa.apricot.util.collection.*; 8 | 9 | import java.util.*; 10 | import java.util.function.*; 11 | 12 | public class MessageBus extends MessageEventHandler implements BusHandler> { 13 | private final List>> handlers = ApricotCollectionFactor.arrayList(); 14 | 15 | /** 16 | * Process event. 17 | * 18 | * @param event 19 | * event 20 | * @author cao_awa 21 | * @author 草二号机 22 | * @since 1.0.0 23 | */ 24 | @Override 25 | public void onMessage(MessageEvent event) { 26 | ApricotServer server = event.proxy() 27 | .server(); 28 | this.handlers.forEach(handler -> server.execute(() -> handler.accept(event))); 29 | } 30 | 31 | @Override 32 | public void register(Consumer> action) { 33 | this.handlers.add((Consumer>) action); 34 | } 35 | 36 | @Override 37 | public void unregister(Consumer> action) { 38 | this.handlers.remove(action); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/internal/bus/handlers/message/PokeBus.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.internal.bus.handlers.message; 2 | 3 | import com.github.cao.awa.apricot.event.handler.poke.*; 4 | import com.github.cao.awa.apricot.event.receive.poke.*; 5 | import com.github.cao.awa.apricot.plugin.internal.bus.handlers.*; 6 | import com.github.cao.awa.apricot.server.*; 7 | import com.github.cao.awa.apricot.util.collection.*; 8 | 9 | import java.util.*; 10 | import java.util.function.*; 11 | 12 | public class PokeBus extends PokeReceivedEventHandler implements BusHandler> { 13 | private final List>> handlers = ApricotCollectionFactor.arrayList(); 14 | 15 | /** 16 | * Process event. 17 | * 18 | * @param event 19 | * event 20 | * @author cao_awa 21 | * @author 草二号机 22 | * @since 1.0.0 23 | */ 24 | @Override 25 | public void onPoke(PokeReceivedEvent event) { 26 | ApricotServer server = event.proxy() 27 | .server(); 28 | this.handlers.forEach(handler -> server.execute(() -> handler.accept(event))); 29 | } 30 | 31 | @Override 32 | public void register(Consumer> action) { 33 | this.handlers.add((Consumer>) action); 34 | } 35 | 36 | @Override 37 | public void unregister(Consumer> action) { 38 | this.handlers.remove(action); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/internal/core/lawn/handler/echo/InternalEchoResultHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.internal.core.lawn.handler.echo; 2 | 3 | import com.github.cao.awa.apricot.event.handler.response.*; 4 | import com.github.cao.awa.apricot.event.receive.response.*; 5 | import org.apache.logging.log4j.*; 6 | 7 | public class InternalEchoResultHandler extends EchoResultEventHandler { 8 | private static final Logger LOGGER = LogManager.getLogger("InternalEchoHandler"); 9 | 10 | /** 11 | * Process event. 12 | * 13 | * @param event 14 | * event 15 | * @author cao_awa 16 | * @author 草二号机 17 | * @since 1.0.0 18 | */ 19 | @Override 20 | public void onResult(EchoResultEvent event) { 21 | event.proxy().server().echo(event.getPacket().getIdentifier(), event.getPacket()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/plugin/internal/core/lawn/handler/message/RecalledMessageHandler.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.plugin.internal.core.lawn.handler.message; 2 | 3 | import com.github.cao.awa.apricot.database.message.store.*; 4 | import com.github.cao.awa.apricot.event.handler.message.recall.*; 5 | import com.github.cao.awa.apricot.event.receive.message.recall.*; 6 | import com.github.cao.awa.apricot.message.store.*; 7 | import com.github.cao.awa.apricot.network.packet.receive.message.recall.*; 8 | import com.github.cao.awa.apricot.network.router.*; 9 | import com.github.cao.awa.apricot.server.*; 10 | 11 | public class RecalledMessageHandler extends MessageRecallEventHandler { 12 | /** 13 | * Process event. 14 | * 15 | * @param event 16 | * event 17 | * @author cao_awa 18 | * @author 草二号机 19 | * @since 1.0.0 20 | */ 21 | @Override 22 | public void onRecall(MessageRecallEvent event) { 23 | MessageRecallPacket packet = event.getPacket(); 24 | ApricotProxy proxy = event.proxy(); 25 | ApricotServer server = proxy.server(); 26 | 27 | MessageDatabase messageDatabase = server.getMessagesHeadOffice(); 28 | MessageStore store = messageDatabase.getFromId(packet.getMessageId()); 29 | store.setRecalled(true); 30 | messageDatabase.setFromId(packet.getMessageId(), store); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/resource/loader/ResourcesLoader.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.resource.loader; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | import java.io.*; 6 | 7 | @Stable 8 | public class ResourcesLoader { 9 | public static InputStream get(String resource) { 10 | return ResourcesLoader.class.getClassLoader().getResourceAsStream(resource); 11 | } 12 | 13 | public static File asFile(String resource) { 14 | return new File(String.valueOf(ResourcesLoader.class.getResource(resource))); 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/server/bootstrap/ApricotBootstrap.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.server.bootstrap; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.server.*; 5 | import com.github.cao.awa.apricot.util.thread.*; 6 | 7 | @Stable 8 | public class ApricotBootstrap { 9 | public static void main(String[] args) { 10 | new ApricotBootstrap().bootstrap(); 11 | } 12 | 13 | public void bootstrap() { 14 | ThreadUtil.setName("Apricot"); 15 | ApricotServer server = new ApricotServer(); 16 | 17 | try { 18 | server.startup(); 19 | } catch (Exception e) { 20 | server.shutdown(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/server/service/ConcurrentService.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.server.service; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | public interface ConcurrentService { 7 | void shutdown(); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/server/service/event/exclusive/EventExclusive.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.server.service.event.exclusive; 2 | 3 | import com.github.cao.awa.apricot.event.handler.*; 4 | import com.github.cao.awa.apricot.mathematic.integer.*; 5 | import com.github.cao.awa.apricot.plugin.*; 6 | import com.github.cao.awa.apricot.util.time.*; 7 | 8 | public record EventExclusive(EventHandler handler, IntegerReceptacle counts, long recorded, long timeout, 9 | Runnable timeoutCallback, EventExclusiveTarget target) { 10 | public EventExclusive(EventHandler handler, IntegerReceptacle counts) { 11 | this( 12 | handler, 13 | counts, 14 | - 1, 15 | - 1, 16 | () -> { 17 | }, 18 | EventExclusiveTarget.SELF 19 | ); 20 | } 21 | 22 | public boolean isValid() { 23 | return this.recorded == - 1 || TimeUtil.processMillion(this.recorded) < this.timeout; 24 | } 25 | 26 | public boolean blocked(Plugin plugin) { 27 | return this.target.getLevel() == EventExclusiveLevel.ALL || (this.target.getLevel() == EventExclusiveLevel.SPECIALS && this.target.getTargets() 28 | .contains(plugin)) || this.target.getLevel() == EventExclusiveLevel.SELF && this.handler.getPlugin() == plugin; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/server/service/event/exclusive/EventExclusiveLevel.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.server.service.event.exclusive; 2 | 3 | public enum EventExclusiveLevel { 4 | SELF, SPECIALS, ALL; 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/server/service/event/exclusive/EventExclusiveTarget.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.server.service.event.exclusive; 2 | 3 | import com.github.cao.awa.apricot.plugin.*; 4 | import com.github.cao.awa.apricot.util.collection.*; 5 | 6 | import java.util.*; 7 | 8 | public class EventExclusiveTarget { 9 | public static final EventExclusiveTarget SELF = new EventExclusiveTarget(EventExclusiveLevel.SELF); 10 | public static final EventExclusiveTarget ALL = new EventExclusiveTarget(EventExclusiveLevel.ALL); 11 | 12 | private final EventExclusiveLevel level; 13 | private final List targets = ApricotCollectionFactor.arrayList(); 14 | 15 | public List getTargets() { 16 | return this.targets; 17 | } 18 | 19 | public EventExclusiveTarget(EventExclusiveLevel level) { 20 | this.level = level; 21 | } 22 | 23 | public EventExclusiveTarget(EventExclusiveLevel level, Plugin targets) { 24 | this.level = level; 25 | this.targets.add(targets); 26 | } 27 | 28 | public EventExclusiveTarget(EventExclusiveLevel level, List targets) { 29 | this.level = level; 30 | this.targets.addAll(targets); 31 | } 32 | 33 | public EventExclusiveLevel getLevel() { 34 | return this.level; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/server/service/plugin/loader/JarSearchLoader.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.server.service.plugin.loader; 2 | 3 | import bot.inker.acj.*; 4 | import com.github.cao.awa.apricot.util.collection.*; 5 | import org.jetbrains.annotations.*; 6 | 7 | import java.io.*; 8 | import java.net.*; 9 | import java.util.*; 10 | import java.util.jar.*; 11 | 12 | public class JarSearchLoader { 13 | public static List load(@NotNull File file) { 14 | final List urls = ApricotCollectionFactor.arrayList(); 15 | List jars = ApricotCollectionFactor.arrayList(); 16 | if (file.exists()) { 17 | if (file.isFile()) { 18 | jars.add(file); 19 | } else { 20 | jars.addAll(Arrays.asList(Objects.requireNonNull(file.listFiles()))); 21 | } 22 | 23 | try { 24 | for (File jarFile : jars) { 25 | JarFile jar = new JarFile(jarFile); 26 | JvmHacker.instrumentation() 27 | .appendToSystemClassLoaderSearch(jar); 28 | urls.add(jarFile.toURI() 29 | .toURL()); 30 | } 31 | } catch (Exception ignored) { 32 | } 33 | } 34 | return urls; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/task/intensive/IntensiveType.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.task.intensive; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | public enum IntensiveType { 7 | CPU, IO 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/thread/pool/ExecutorFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.thread.pool; 2 | 3 | import java.util.concurrent.*; 4 | 5 | public class ExecutorFactor { 6 | public static ExecutorService virtual() { 7 | return Executors.newVirtualThreadPerTaskExecutor(); 8 | } 9 | 10 | public static ExecutorService cached() { 11 | return Executors.newCachedThreadPool(); 12 | } 13 | 14 | public static ExecutorService fixed(int nThreads) { 15 | return Executors.newFixedThreadPool(nThreads); 16 | } 17 | 18 | public static ExecutorService single() { 19 | return Executors.newSingleThreadExecutor(); 20 | } 21 | 22 | public static ExecutorService intensiveIo() { 23 | return virtual(); 24 | } 25 | 26 | public static ExecutorService intensiveCpu() { 27 | return cached(); 28 | } 29 | 30 | public static ExecutorService scheduled(int coreSize) { 31 | return Executors.newScheduledThreadPool(coreSize); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/util/collection/ApricotCollectionFactor.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.util.collection; 2 | 3 | import java.util.*; 4 | import java.util.concurrent.*; 5 | 6 | public class ApricotCollectionFactor { 7 | public static Map hashMap() { 8 | return new HashMap<>(); 9 | // return new Object2ObjectOpenHashMap<>(); 10 | } 11 | 12 | public static Map hashMap(Map map) { 13 | return new HashMap<>(map); 14 | // return new Object2ObjectOpenHashMap<>(map); 15 | } 16 | 17 | public static ConcurrentHashMap concurrentHashMap() { 18 | return new ConcurrentHashMap<>(); 19 | } 20 | 21 | public static List arrayList() { 22 | return new ArrayList<>(); 23 | // return new ObjectArrayList<>(); 24 | } 25 | 26 | public static List arrayList(int capacity) { 27 | return new ArrayList<>(capacity); 28 | // return new ObjectArrayList<>(capacity); 29 | } 30 | 31 | public static List linkedList() { 32 | return new LinkedList<>(); 33 | } 34 | 35 | public static Set hashSet() { 36 | return new HashSet<>(); 37 | // return new ObjectOpenHashSet<>(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/util/file/FileUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.util.file; 2 | 3 | import java.io.*; 4 | 5 | public class FileUtil { 6 | public static void mkdirs(String file) { 7 | mkdirs(new File(file)); 8 | } 9 | 10 | public static void mkdirs(File file) { 11 | if (! file.exists()) { 12 | file.mkdirs(); 13 | } 14 | } 15 | 16 | public static void mkdirsParent(File file) { 17 | file = file.getParentFile(); 18 | if (! file.exists()) { 19 | file.mkdirs(); 20 | } 21 | } 22 | 23 | public static void delete(File file) { 24 | if (file.exists()) { 25 | file.delete(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/util/process/AndPredicates.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.util.process; 2 | 3 | import com.github.cao.awa.apricot.util.collection.ApricotCollectionFactor; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | import java.util.function.Predicate; 8 | 9 | public class AndPredicates { 10 | private final List> predicates = ApricotCollectionFactor.arrayList(); 11 | private final T target; 12 | 13 | public AndPredicates(T target) { 14 | this.target = target; 15 | } 16 | 17 | public AndPredicates and(Predicate predicate) { 18 | this.predicates.add(predicate); 19 | return this; 20 | } 21 | 22 | public static AndPredicates target(X target) { 23 | return new AndPredicates<>(target); 24 | } 25 | 26 | public boolean execute() { 27 | for (Predicate predicate : this.predicates) { 28 | if (!predicate.test(this.target)) { 29 | return false; 30 | } 31 | } 32 | return true; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/util/process/OrPredicates.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.util.process; 2 | 3 | import com.github.cao.awa.apricot.util.collection.ApricotCollectionFactor; 4 | 5 | import java.util.List; 6 | import java.util.function.Predicate; 7 | 8 | public class OrPredicates { 9 | private final List> predicates = ApricotCollectionFactor.arrayList(); 10 | private final T target; 11 | 12 | public OrPredicates(T target) { 13 | this.target = target; 14 | } 15 | 16 | public OrPredicates and(Predicate predicate) { 17 | this.predicates.add(predicate); 18 | return this; 19 | } 20 | 21 | public static OrPredicates target(X target) { 22 | return new OrPredicates<>(target); 23 | } 24 | 25 | public boolean execute() { 26 | for (Predicate predicate : this.predicates) { 27 | if (predicate.test(this.target)) { 28 | return true; 29 | } 30 | } 31 | return false; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/util/text/UnicodeUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.util.text; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | public class UnicodeUtil { 7 | private static final Pattern PATTERN = Pattern.compile("\\\\u[\\da-f]{4}"); 8 | 9 | public static String stringToUnicode(String s) { 10 | StringBuilder result = new StringBuilder(); 11 | StringBuilder builder = new StringBuilder(); 12 | for (int integer = 0; integer < s.length(); integer++) { 13 | result.append("\\u"); 14 | builder.setLength(0); 15 | builder.append(Integer.toHexString(s.charAt(integer)) 16 | .toLowerCase()); 17 | while (builder.length() < 4) { 18 | builder.insert(0, 19 | 0 20 | ); 21 | } 22 | result.append(builder); 23 | } 24 | return result.toString(); 25 | } 26 | 27 | public static String unicodeToString(String s) { 28 | StringBuilder result = new StringBuilder(); 29 | s = s.toLowerCase(); 30 | result.setLength(0); 31 | Matcher m = PATTERN.matcher(s); 32 | while (m.find()) { 33 | result.append((char) Integer.parseInt(m.group() 34 | .substring(2), 35 | 16 36 | )); 37 | } 38 | return result.toString(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/util/thread/ThreadUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.util.thread; 2 | 3 | public class ThreadUtil { 4 | public static void setName(String name) { 5 | setName(Thread.currentThread(), name); 6 | } 7 | 8 | public static void setName(Thread thread, String name) { 9 | thread.setName(name); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/github/cao/awa/apricot/util/time/TimeUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.cao.awa.apricot.util.time; 2 | 3 | import com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.*; 4 | 5 | import java.text.SimpleDateFormat; 6 | import java.util.Date; 7 | 8 | public class TimeUtil { 9 | public static long millions() { 10 | return System.currentTimeMillis(); 11 | } 12 | 13 | public static long nano() { 14 | return System.nanoTime(); 15 | } 16 | 17 | public static long processMillion(long million) { 18 | return millions() - million; 19 | } 20 | 21 | public static long processNano(long nano) { 22 | return nano() - nano; 23 | } 24 | 25 | public static void sleep(long millions) throws InterruptedException { 26 | if (millions < 0) 27 | return; 28 | Thread.sleep(millions); 29 | } 30 | 31 | public static void coma(long millions) { 32 | EntrustEnvironment.trys(() -> Thread.sleep(millions)); 33 | } 34 | 35 | public static long nanoId() { 36 | return nano() / 100; 37 | } 38 | 39 | public static String format(String pattern) { 40 | SimpleDateFormat format = new SimpleDateFormat(pattern); 41 | return format.format(new Date()); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/affair/Affair.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.affair; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | import com.github.cao.awa.apricot.util.collection.*; 5 | 6 | import java.util.*; 7 | 8 | @Stable 9 | public class Affair { 10 | private final List actions = ApricotCollectionFactor.linkedList(); 11 | 12 | public static Affair of(Runnable action) { 13 | return new Affair().add(action); 14 | } 15 | 16 | public static Affair empty() { 17 | return new Affair(); 18 | } 19 | 20 | public Affair add(Runnable action) { 21 | this.actions.add(action); 22 | return this; 23 | } 24 | 25 | public void done() { 26 | this.actions.forEach(Runnable::run); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/entrust/function/ExceptingFunction.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.function; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | @FunctionalInterface 7 | public interface ExceptingFunction { 8 | /** 9 | * Applies this function to the given argument. 10 | * 11 | * @param t the function argument 12 | * @return the function result 13 | */ 14 | R apply(T t) throws Exception; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/entrust/function/ExceptingRunnable.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.function; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | import java.io.*; 6 | 7 | @Stable 8 | public interface ExceptingRunnable extends Serializable { 9 | void apply() throws Exception; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/entrust/function/ExceptingSupplier.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.function; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | import java.io.*; 6 | 7 | /** 8 | * Represents a supplier of results. 9 | * 10 | * Ref from {@link java.util.function.Supplier}, throwing Exceptions 11 | * 12 | *

There is no requirement that a new or distinct result be returned each 13 | * time the supplier is invoked. 14 | * 15 | *

This is a functional interface 16 | * whose functional method is {@link #get()}. 17 | * 18 | * @param the type of results supplied by this supplier 19 | */ 20 | @Stable 21 | @FunctionalInterface 22 | public interface ExceptingSupplier extends Serializable { 23 | 24 | /** 25 | * Gets a result. 26 | * 27 | * @return a result 28 | */ 29 | T get() throws Exception; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/entrust/function/TriConsumer.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.function; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | import java.io.*; 6 | import java.util.*; 7 | 8 | @Stable 9 | public interface TriConsumer extends Serializable { 10 | /** 11 | * Returns a composed {@code Consumer} that performs, in sequence, this 12 | * operation followed by the {@code after} operation. If performing either 13 | * operation throws an exception, it is relayed to the caller of the 14 | * composed operation. If performing this operation throws an exception, 15 | * the {@code after} operation will not be performed. 16 | * 17 | * @param after 18 | * the operation to perform after this operation 19 | * @return a composed {@code Consumer} that performs in sequence this 20 | * operation followed by the {@code after} operation 21 | * 22 | */ 23 | default TriConsumer andThen(TriConsumer after) { 24 | Objects.requireNonNull(after); 25 | return (x, y, z) -> { 26 | accept(x, y, z); 27 | after.accept(x, y, z); 28 | }; 29 | } 30 | 31 | void accept(X x, Y y, Z z); 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/entrust/function/TriFunction.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.entrust.function; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | import java.util.*; 6 | import java.util.function.*; 7 | 8 | @Stable 9 | public interface TriFunction { 10 | /** 11 | * Applies this function to the given arguments. 12 | * 13 | * @param a the first function argument 14 | * @param b the second function argument 15 | * @return the function result 16 | */ 17 | R apply(A a, B b, C c); 18 | 19 | /** 20 | * Returns a composed function that first applies this function to 21 | * its input, and then applies the {@code after} function to the result. 22 | * If evaluation of either function throws an exception, it is relayed to 23 | * the caller of the composed function. 24 | * 25 | * @param the type of output of the {@code after} function, and of the 26 | * composed function 27 | * @param after the function to apply after this function is applied 28 | * @return a composed function that first applies this function and then 29 | * applies the {@code after} function 30 | * @throws NullPointerException if after is null 31 | */ 32 | default TriFunction andThen(Function after) { 33 | Objects.requireNonNull(after); 34 | return (a, b, c) -> after.apply(apply(a, b, c)); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/option/BiOption.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.option; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | /** 6 | * Choice one or two target. 7 | * 8 | * @param 9 | * Option type 10 | * @param first 11 | * First option 12 | * @param second 13 | * Second option 14 | * @author cao_awa 15 | * @since 1.0.0 16 | */ 17 | @Stable 18 | public record BiOption(T first, T second) { 19 | public static BiOption of(X x1, X x2) { 20 | return new BiOption<>( 21 | x1, 22 | x2 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/pair/Pair.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.pair; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | public record Pair(T left, Y right) { 7 | public static Pair of(T left, Y right) { 8 | return new Pair<>( 9 | left, 10 | right 11 | ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/receptacle/Legacy.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.receptacle; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | @Stable 6 | public record Legacy(N newly, O stale) { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/zhuaidadaya/rikaishinikui/handler/universal/receptacle/Receptacle.java: -------------------------------------------------------------------------------- 1 | package com.github.zhuaidadaya.rikaishinikui.handler.universal.receptacle; 2 | 3 | import com.github.cao.awa.apricot.anntations.*; 4 | 5 | import java.util.function.*; 6 | 7 | @Stable 8 | public final class Receptacle { 9 | private T target; 10 | 11 | public Receptacle(T target) { 12 | this.target = target; 13 | } 14 | 15 | public static Receptacle of() { 16 | return of(null); 17 | } 18 | 19 | public static Receptacle of(X target) { 20 | return new Receptacle<>(target); 21 | } 22 | 23 | public T getOrSet(Supplier target) { 24 | if (this.target == null) { 25 | return set(target.get()).get(); 26 | } 27 | return get(); 28 | } 29 | 30 | public T get() { 31 | return this.target; 32 | } 33 | 34 | public Receptacle set(T target) { 35 | this.target = target; 36 | return this; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/resources/apricot.banner: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cao-awa/Apricot/45a46cd9fddf43387b9d84e4b4c7f978d7d2079a/src/main/resources/apricot.banner -------------------------------------------------------------------------------- /src/main/resources/assets/plugins/Apricot/Apricot.json: -------------------------------------------------------------------------------- 1 | { 2 | "blocked": [ 3 | ] 4 | } -------------------------------------------------------------------------------- /src/main/resources/assets/plugins/Captcha/Captcha.json: -------------------------------------------------------------------------------- 1 | { 2 | "allows": [ 3 | ], 4 | "licences": [ 5 | ], 6 | "blocked": [ 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/assets/plugins/Captcha/JoinGroup/JoinGroup.json: -------------------------------------------------------------------------------- 1 | { 2 | "mute": false, 3 | "allows": [ 4 | ] 5 | } -------------------------------------------------------------------------------- /src/main/resources/assets/plugins/Grass/FastDelete/FastDelete.json: -------------------------------------------------------------------------------- 1 | { 2 | "delete_responses": { 3 | "#": "#%s ", 4 | "unexpected_error": "执行命令时遇到了未知的错误", 5 | "missing_reason": "缺少快速删除理由", 6 | "fast_delete_must_reply_to_message": "使用快速删除时请回复要删除的消息", 7 | "deleted": "已尝试删除,", 8 | "unable_to_delete": "无法删除 #%s,请联系管理员或群主", 9 | "v": "理由为:恶意骚扰", 10 | "d6": "理由为:恶意骚扰", 11 | "d": "理由为:谣言信息", 12 | "d5": "理由为:谣言信息", 13 | "a": "理由为:人身攻击", 14 | "d4": "理由为:人身攻击", 15 | "s": "理由为:色情淫秽", 16 | "d3": "理由为:色情淫秽", 17 | "p": "理由为:政治敏感", 18 | "d2": "理由为:政治敏感", 19 | "ad": "理由为: 广告", 20 | "d1": "理由为: 广告", 21 | "n": "理由为: 其他", 22 | "d0": "理由为: 其他" 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/resources/assets/plugins/Grass/Grass.json: -------------------------------------------------------------------------------- 1 | { 2 | "allows": [ 3 | ], 4 | "licences": [ 5 | ], 6 | "blocked": [ 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/assets/plugins/Grass/MuteMe/MuteMe.json: -------------------------------------------------------------------------------- 1 | { 2 | "do_mute_me_response": "好", 3 | "cannot_mute_response": "不禁言你" 4 | } -------------------------------------------------------------------------------- /src/main/resources/assets/plugins/Grass/QuickResponse/QuickResponse.json: -------------------------------------------------------------------------------- 1 | { 2 | "quick_responses": [ 3 | "嗯嗯?", 4 | "怎么啦?", 5 | "有什么事?", 6 | "嗯?", 7 | "在", 8 | "怎么了?", 9 | "我不在" 10 | ] 11 | } -------------------------------------------------------------------------------- /src/main/resources/assets/plugins/Lawn/Lawn.json: -------------------------------------------------------------------------------- 1 | { 2 | "allows": [ 3 | ], 4 | "licences": [ 5 | ], 6 | "blocked": [ 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | --------------------------------------------------------------------------------