mirror of
https://github.com/mamoe/mirai.git
synced 2026-09-06 07:04:56 +08:00
Renamed robot to bot
This commit is contained in:
@@ -40,8 +40,8 @@ Network部分使用 Kotlin 完成(因为kt有对 unsigned byte 的支持).
|
||||
- [X] Network - Message Receiving
|
||||
- [X] Network - Message Sending
|
||||
- [ ] Network - Events **(Working on)**
|
||||
- [ ] Robot - Friend/group list
|
||||
- [ ] Robot - Actions(joining group, adding friend, etc.)
|
||||
- [ ] Bot - Friend/group list
|
||||
- [ ] Bot - Actions(joining group, adding friend, etc.)
|
||||
- [ ] Message Section **(Working on)**
|
||||
- [ ] Contact
|
||||
- [ ] UI
|
||||
|
||||
@@ -3,9 +3,9 @@ package net.mamoe.mirai;
|
||||
import lombok.Getter;
|
||||
import net.mamoe.mirai.contact.Group;
|
||||
import net.mamoe.mirai.contact.QQ;
|
||||
import net.mamoe.mirai.network.RobotNetworkHandler;
|
||||
import net.mamoe.mirai.network.BotNetworkHandler;
|
||||
import net.mamoe.mirai.utils.BotAccount;
|
||||
import net.mamoe.mirai.utils.ContactList;
|
||||
import net.mamoe.mirai.utils.RobotAccount;
|
||||
import net.mamoe.mirai.utils.config.MiraiConfigSection;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -15,43 +15,47 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* Mirai 的机器人. 一个机器人实例登录一个 QQ 账号.
|
||||
* Mirai 为多账号设计, 可同时维护多个机器人账号.
|
||||
* Mirai 为多账号设计, 可同时维护多个机器人.
|
||||
* <br>
|
||||
* {@link Robot} 由 2 个模块组成.
|
||||
* {@linkplain ContactSystem 联系人管理}: 可通过 {@link Robot#contacts} 访问
|
||||
* {@linkplain RobotNetworkHandler 网络处理器}: 可通过 {@link Robot#network} 访问
|
||||
* {@link Bot} 由 2 个模块组成.
|
||||
* {@linkplain ContactSystem 联系人管理}: 可通过 {@link Bot#contacts} 访问
|
||||
* {@linkplain BotNetworkHandler 网络处理器}: 可通过 {@link Bot#network} 访问
|
||||
* <br>
|
||||
* 另外地, 若你需要得到机器人的 QQ 账号, 请访问 {@link Robot#account}
|
||||
* 若你需要得到服务器上所有机器人列表, 请访问 {@link Robot#instances}
|
||||
* 若你需要得到机器人的 QQ 账号, 请访问 {@link Bot#account}
|
||||
* 若你需要得到服务器上所有机器人列表, 请访问 {@link Bot#instances}
|
||||
*
|
||||
* @author Him188moe
|
||||
* @author NatrualHG
|
||||
* @see net.mamoe.mirai.contact.Contact
|
||||
*
|
||||
* <p>
|
||||
* Robot that is the base of the whole program.
|
||||
* Bot that is the base of the whole program.
|
||||
* It contains a {@link ContactSystem}, which manage contacts such as {@link QQ} and {@link Group}.
|
||||
*/
|
||||
public final class Robot implements Closeable {
|
||||
public static final List<Robot> instances = Collections.synchronizedList(new LinkedList<>());
|
||||
public final class Bot implements Closeable {
|
||||
public static final List<Bot> instances = Collections.synchronizedList(new LinkedList<>());
|
||||
|
||||
{
|
||||
instances.add(this);
|
||||
}
|
||||
|
||||
public final int id = _id.getAndAdd(1);
|
||||
|
||||
public final RobotAccount account;
|
||||
public final BotAccount account;
|
||||
|
||||
public final ContactSystem contacts = new ContactSystem();
|
||||
|
||||
public final RobotNetworkHandler network;
|
||||
public final BotNetworkHandler network;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("Robot{id=%d,qq=%d}", id, this.account.qqNumber);
|
||||
return String.format("Bot{id=%d,qq=%d}", id, this.account.qqNumber);
|
||||
}
|
||||
|
||||
/**
|
||||
* Robot 联系人管理.
|
||||
* Bot 联系人管理.
|
||||
*
|
||||
* @see Robot#contacts
|
||||
* @see Bot#contacts
|
||||
*/
|
||||
public final class ContactSystem {
|
||||
private final ContactList<Group> groups = new ContactList<>();
|
||||
@@ -63,14 +67,14 @@ public final class Robot implements Closeable {
|
||||
|
||||
public QQ getQQ(long qqNumber) {
|
||||
if (!this.qqs.containsKey(qqNumber)) {
|
||||
this.qqs.put(qqNumber, new QQ(Robot.this, qqNumber));
|
||||
this.qqs.put(qqNumber, new QQ(Bot.this, qqNumber));
|
||||
}
|
||||
return this.qqs.get(qqNumber);
|
||||
}
|
||||
|
||||
public Group getGroupByNumber(long groupNumber) {
|
||||
if (!this.groups.containsKey(groupNumber)) {
|
||||
this.groups.put(groupNumber, new Group(Robot.this, groupNumber));
|
||||
this.groups.put(groupNumber, new Group(Bot.this, groupNumber));
|
||||
}
|
||||
return groups.get(groupNumber);
|
||||
}
|
||||
@@ -91,9 +95,9 @@ public final class Robot implements Closeable {
|
||||
return owners.contains(ownerName);
|
||||
}
|
||||
|
||||
public Robot(MiraiConfigSection<Object> data) throws Throwable {
|
||||
public Bot(MiraiConfigSection<Object> data) throws Throwable {
|
||||
this(
|
||||
new RobotAccount(
|
||||
new BotAccount(
|
||||
data.getLongOrThrow("account", () -> new IllegalArgumentException("account")),
|
||||
data.getStringOrThrow("password", () -> new IllegalArgumentException("password"))
|
||||
),
|
||||
@@ -101,12 +105,12 @@ public final class Robot implements Closeable {
|
||||
);
|
||||
}
|
||||
|
||||
public Robot(@NotNull RobotAccount account, @NotNull List<String> owners) {
|
||||
public Bot(@NotNull BotAccount account, @NotNull List<String> owners) {
|
||||
Objects.requireNonNull(account);
|
||||
Objects.requireNonNull(owners);
|
||||
this.account = account;
|
||||
this.owners = Collections.unmodifiableList(owners);
|
||||
this.network = new RobotNetworkHandler(this);
|
||||
this.network = new BotNetworkHandler(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,10 +6,10 @@ import net.mamoe.mirai.event.events.server.ServerDisabledEvent;
|
||||
import net.mamoe.mirai.event.events.server.ServerEnabledEvent;
|
||||
import net.mamoe.mirai.network.packet.login.LoginState;
|
||||
import net.mamoe.mirai.task.MiraiTaskManager;
|
||||
import net.mamoe.mirai.utils.BotAccount;
|
||||
import net.mamoe.mirai.utils.LoggerTextFormat;
|
||||
import net.mamoe.mirai.utils.MiraiLogger;
|
||||
import net.mamoe.mirai.utils.MiraiLoggerKt;
|
||||
import net.mamoe.mirai.utils.RobotAccount;
|
||||
import net.mamoe.mirai.utils.config.MiraiConfig;
|
||||
import net.mamoe.mirai.utils.config.MiraiConfigSection;
|
||||
import net.mamoe.mirai.utils.setting.MiraiSettingListSection;
|
||||
@@ -155,7 +155,7 @@ public class MiraiServer {
|
||||
MiraiConfigSection<Object> section = new MiraiConfigSection<>();
|
||||
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
getLogger().info("Input a " + LoggerTextFormat.RED + " QQ number " + LoggerTextFormat.GREEN + "for default robotNetworkHandler");
|
||||
getLogger().info("Input a " + LoggerTextFormat.RED + " QQ number " + LoggerTextFormat.GREEN + "for default botNetworkHandler");
|
||||
getLogger().info("输入用于默认机器人的QQ号");
|
||||
long qqNumber = scanner.nextLong();
|
||||
getLogger().info("Input the password for that QQ account");
|
||||
@@ -176,33 +176,33 @@ public class MiraiServer {
|
||||
getLogger().info(LoggerTextFormat.GREEN + "Server enabled; Welcome to Mirai");
|
||||
getLogger().info("Mirai Version=" + MiraiServer.MIRAI_VERSION + " QQ Version=" + MiraiServer.QQ_VERSION);
|
||||
|
||||
getLogger().info("Initializing [Robot]s");
|
||||
getLogger().info("Initializing [Bot]s");
|
||||
|
||||
try {
|
||||
getAvailableRobot();
|
||||
getAvailableBot();
|
||||
} catch (ExecutionException | InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
/*
|
||||
this.qqs.keySet().stream().map(key -> this.qqs.getSection(key)).forEach(section -> {
|
||||
getLogger().info("Initializing [Robot] " + section.getString("account"));
|
||||
getLogger().info("Initializing [Bot] " + section.getString("account"));
|
||||
try {
|
||||
Robot robot = new Robot(section);
|
||||
var state = robot.network.tryLogin$mirai_core().get();
|
||||
//robot.network.tryLogin$mirai_core().whenComplete((state, e) -> {
|
||||
Bot bot = new Bot(section);
|
||||
var state = bot.network.tryLogin$mirai_core().get();
|
||||
//bot.network.tryLogin$mirai_core().whenComplete((state, e) -> {
|
||||
if (state == LoginState.SUCCESS) {
|
||||
Robot.instances.add(robot);
|
||||
Bot.instances.add(bot);
|
||||
getLogger().success(" Login Succeed");
|
||||
} else {
|
||||
getLogger().error(" Login Failed with error " + state);
|
||||
robot.close();
|
||||
bot.close();
|
||||
}
|
||||
// }).get();
|
||||
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
getLogger().error("Could not load QQ robots config!");
|
||||
getLogger().error("Could not load QQ bots config!");
|
||||
System.exit(1);
|
||||
}
|
||||
});*/
|
||||
@@ -219,14 +219,14 @@ public class MiraiServer {
|
||||
"1515419818----1234567890\n" +
|
||||
"3107367848----987654321\n";
|
||||
|
||||
private Robot getAvailableRobot() throws ExecutionException, InterruptedException {
|
||||
private Bot getAvailableBot() throws ExecutionException, InterruptedException {
|
||||
for (String it : qqList.split("\n")) {
|
||||
var strings = it.split("----");
|
||||
var robot = new Robot(new RobotAccount(Long.parseLong(strings[0]), strings[1]), List.of());
|
||||
var bot = new Bot(new BotAccount(Long.parseLong(strings[0]), strings[1]), List.of());
|
||||
|
||||
if (robot.network.tryLogin$mirai_core().get() == LoginState.SUCCESS) {
|
||||
MiraiLoggerKt.success(robot, "Login succeed");
|
||||
return robot;
|
||||
if (bot.network.tryLogin$mirai_core().get() == LoginState.SUCCESS) {
|
||||
MiraiLoggerKt.success(bot, "Login succeed");
|
||||
return bot;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
package net.mamoe.mirai.contact
|
||||
|
||||
import net.mamoe.mirai.Robot
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.message.Message
|
||||
import net.mamoe.mirai.message.defaults.MessageChain
|
||||
import net.mamoe.mirai.message.defaults.PlainText
|
||||
|
||||
/**
|
||||
* A contact is a [QQ] or a [Group] for one particular [Robot] instance only.
|
||||
* A contact is a [QQ] or a [Group] for one particular [Bot] instance only.
|
||||
*
|
||||
* @param robot Owner [Robot]
|
||||
* @param bot Owner [Bot]
|
||||
* @author Him188moe
|
||||
*/
|
||||
abstract class Contact internal constructor(val robot: Robot, val number: Long) {
|
||||
abstract class Contact internal constructor(val bot: Bot, val number: Long) {
|
||||
/**
|
||||
* Async
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package net.mamoe.mirai.contact
|
||||
|
||||
import net.mamoe.mirai.Robot
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.contact.Group.Companion.groupNumberToId
|
||||
import net.mamoe.mirai.message.defaults.MessageChain
|
||||
import net.mamoe.mirai.utils.ContactList
|
||||
@@ -10,18 +10,18 @@ import java.io.Closeable
|
||||
* 群
|
||||
*
|
||||
* Java 获取 groupNumber: `group.getNumber()`
|
||||
* Java 获取所属 robot: `group.getRobot()`
|
||||
* Java 获取所属 bot: `group.getBot()`
|
||||
* Java 获取群成员列表: `group.getMembers()`
|
||||
* Java 获取 groupId: `group.getGroupId()`
|
||||
*
|
||||
* Java 调用 [groupNumberToId] : `Group.groupNumberToId(number)`
|
||||
*/
|
||||
class Group(robot: Robot, number: Long) : Contact(robot, number), Closeable {
|
||||
class Group(bot: Bot, number: Long) : Contact(bot, number), Closeable {
|
||||
val groupId = groupNumberToId(number)
|
||||
val members = ContactList<QQ>()
|
||||
|
||||
override fun sendMessage(message: MessageChain) {
|
||||
robot.network.messageHandler.sendGroupMessage(this, message)
|
||||
bot.network.messageHandler.sendGroupMessage(this, message)
|
||||
}
|
||||
|
||||
override fun sendXMLMessage(message: String) {
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
package net.mamoe.mirai.contact
|
||||
|
||||
import net.mamoe.mirai.Robot
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.message.Message
|
||||
import net.mamoe.mirai.message.defaults.At
|
||||
import net.mamoe.mirai.message.defaults.MessageChain
|
||||
|
||||
/**
|
||||
* QQ 账号.
|
||||
* 注意: 一个 [QQ] 实例并不是独立的, 它属于一个 [Robot].
|
||||
* 注意: 一个 [QQ] 实例并不是独立的, 它属于一个 [Bot].
|
||||
*
|
||||
* Java 获取 qq 号: `qq.getNumber()`
|
||||
* Java 获取所属 robot: `qq.getRobot()`
|
||||
* Java 获取所属 bot: `qq.getBot()`
|
||||
*
|
||||
* A QQ instance helps you to receive message from or send message to.
|
||||
* Notice that, one QQ instance belong to one [Robot], that is, QQ instances from different [Robot] are NOT the same.
|
||||
* Notice that, one QQ instance belong to one [Bot], that is, QQ instances from different [Bot] are NOT the same.
|
||||
*
|
||||
* @author Him188moe
|
||||
*/
|
||||
class QQ(robot: Robot, number: Long) : Contact(robot, number) {
|
||||
class QQ(bot: Bot, number: Long) : Contact(bot, number) {
|
||||
override fun sendMessage(message: MessageChain) {
|
||||
robot.network.messageHandler.sendFriendMessage(this, message)
|
||||
bot.network.messageHandler.sendFriendMessage(this, message)
|
||||
}
|
||||
|
||||
override fun sendXMLMessage(message: String) {
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package net.mamoe.mirai.event.events.bot;
|
||||
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.event.MiraiEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public abstract class BotEvent extends MiraiEvent {
|
||||
private final Bot bot;
|
||||
|
||||
public BotEvent(@NotNull Bot bot) {
|
||||
this.bot = Objects.requireNonNull(bot);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Bot getBot() {
|
||||
return bot;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package net.mamoe.mirai.event.events.bot
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.event.MiraiEvent
|
||||
|
||||
/**
|
||||
* @author Him188moe
|
||||
*/
|
||||
class BotLoginEvent(val bot: Bot) : MiraiEvent()
|
||||
|
||||
class BotLogoutEvent(val bot: Bot) : MiraiEvent()
|
||||
|
||||
class BotMessageReceivedEvent(val bot: Bot, val type: Type, val message: String) : MiraiEvent() {
|
||||
enum class Type {
|
||||
FRIEND,
|
||||
GROUP
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package net.mamoe.mirai.event.events.bot;
|
||||
|
||||
import net.mamoe.mirai.Bot;
|
||||
|
||||
public final class BotLoginSucceedEvent extends BotEvent {
|
||||
|
||||
public BotLoginSucceedEvent(Bot bot) {
|
||||
super(bot);
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,18 @@
|
||||
package net.mamoe.mirai.event.events.group;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.contact.Group;
|
||||
import net.mamoe.mirai.event.events.robot.RobotEvent;
|
||||
import net.mamoe.mirai.event.events.bot.BotEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* @author Him188moe
|
||||
*/
|
||||
public abstract class GroupEvent extends RobotEvent {
|
||||
public abstract class GroupEvent extends BotEvent {
|
||||
private final Group group;
|
||||
|
||||
public GroupEvent(Robot robot, Group group) {
|
||||
super(robot);
|
||||
public GroupEvent(Bot bot, Group group) {
|
||||
super(bot);
|
||||
this.group = group;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package net.mamoe.mirai.event.events.group;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.contact.Group;
|
||||
import net.mamoe.mirai.contact.QQ;
|
||||
import net.mamoe.mirai.message.defaults.MessageChain;
|
||||
@@ -14,8 +14,8 @@ public final class GroupMessageEvent extends GroupEvent {
|
||||
private final MessageChain messageChain;
|
||||
private final String messageString;
|
||||
|
||||
public GroupMessageEvent(@NotNull Robot robot, @NotNull Group group, @NotNull QQ sender, @NotNull MessageChain messageChain) {
|
||||
super(robot, group);
|
||||
public GroupMessageEvent(@NotNull Bot bot, @NotNull Group group, @NotNull QQ sender, @NotNull MessageChain messageChain) {
|
||||
super(bot, group);
|
||||
this.sender = sender;
|
||||
this.messageChain = messageChain;
|
||||
this.messageString = messageChain.toString();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package net.mamoe.mirai.event.events.network;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.event.Cancellable;
|
||||
import net.mamoe.mirai.network.packet.ClientPacket;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
* @author Him188moe
|
||||
*/
|
||||
public final class BeforePacketSendEvent extends ClientPacketEvent implements Cancellable {
|
||||
public BeforePacketSendEvent(@NotNull Robot robot, @NotNull ClientPacket packet) {
|
||||
super(robot, packet);
|
||||
public BeforePacketSendEvent(@NotNull Bot bot, @NotNull ClientPacket packet) {
|
||||
super(bot, packet);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package net.mamoe.mirai.event.events.network;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.network.packet.ClientPacket;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -8,8 +8,8 @@ import org.jetbrains.annotations.NotNull;
|
||||
* @author Him188moe
|
||||
*/
|
||||
public abstract class ClientPacketEvent extends PacketEvent {
|
||||
public ClientPacketEvent(@NotNull Robot robot, @NotNull ClientPacket packet) {
|
||||
super(robot, packet);
|
||||
public ClientPacketEvent(@NotNull Bot bot, @NotNull ClientPacket packet) {
|
||||
super(bot, packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package net.mamoe.mirai.event.events.network;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.event.events.robot.RobotEvent;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.event.events.bot.BotEvent;
|
||||
import net.mamoe.mirai.network.packet.Packet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -10,11 +10,11 @@ import java.util.Objects;
|
||||
/**
|
||||
* @author Him188moe
|
||||
*/
|
||||
public abstract class PacketEvent extends RobotEvent {
|
||||
public abstract class PacketEvent extends BotEvent {
|
||||
private final Packet packet;
|
||||
|
||||
public PacketEvent(@NotNull Robot robot, @NotNull Packet packet) {
|
||||
super(robot);
|
||||
public PacketEvent(@NotNull Bot bot, @NotNull Packet packet) {
|
||||
super(bot);
|
||||
this.packet = Objects.requireNonNull(packet);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package net.mamoe.mirai.event.events.network;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.network.packet.ClientPacket;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
* @author Him188moe
|
||||
*/
|
||||
public final class PacketSentEvent extends ClientPacketEvent {
|
||||
public PacketSentEvent(@NotNull Robot robot, @NotNull ClientPacket packet) {
|
||||
super(robot, packet);
|
||||
public PacketSentEvent(@NotNull Bot bot, @NotNull ClientPacket packet) {
|
||||
super(bot, packet);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package net.mamoe.mirai.event.events.network;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.network.packet.ServerPacket;
|
||||
|
||||
/**
|
||||
* @author Him188moe
|
||||
*/
|
||||
public abstract class ServerPacketEvent extends PacketEvent {
|
||||
public ServerPacketEvent(Robot robot, ServerPacket packet) {
|
||||
super(robot, packet);
|
||||
public ServerPacketEvent(Bot bot, ServerPacket packet) {
|
||||
super(bot, packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package net.mamoe.mirai.event.events.network;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.event.Cancellable;
|
||||
import net.mamoe.mirai.network.packet.ServerPacket;
|
||||
import net.mamoe.mirai.network.packet.ServerVerificationCodePacket;
|
||||
@@ -12,7 +12,7 @@ import net.mamoe.mirai.network.packet.ServerVerificationCodePacket;
|
||||
* @author Him188moe
|
||||
*/
|
||||
public final class ServerPacketReceivedEvent extends ServerPacketEvent implements Cancellable {
|
||||
public ServerPacketReceivedEvent(Robot robot, ServerPacket packet) {
|
||||
super(robot, packet);
|
||||
public ServerPacketReceivedEvent(Bot bot, ServerPacket packet) {
|
||||
super(bot, packet);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package net.mamoe.mirai.event.events.qq;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.contact.QQ;
|
||||
import net.mamoe.mirai.event.events.robot.RobotEvent;
|
||||
import net.mamoe.mirai.event.events.bot.BotEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Objects;
|
||||
@@ -10,11 +10,11 @@ import java.util.Objects;
|
||||
/**
|
||||
* @author Him188moe
|
||||
*/
|
||||
public abstract class FriendEvent extends RobotEvent {
|
||||
public abstract class FriendEvent extends BotEvent {
|
||||
private final QQ qq;
|
||||
|
||||
public FriendEvent(@NotNull Robot robot, @NotNull QQ qq) {
|
||||
super(robot);
|
||||
public FriendEvent(@NotNull Bot bot, @NotNull QQ qq) {
|
||||
super(bot);
|
||||
this.qq = Objects.requireNonNull(qq);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package net.mamoe.mirai.event.events.qq;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
import net.mamoe.mirai.contact.QQ;
|
||||
import net.mamoe.mirai.message.defaults.MessageChain;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -13,8 +13,8 @@ import java.util.Objects;
|
||||
public final class FriendMessageEvent extends FriendEvent {
|
||||
private final MessageChain messageChain;
|
||||
|
||||
public FriendMessageEvent(@NotNull Robot robot, @NotNull QQ sender, @NotNull MessageChain messageChain) {
|
||||
super(robot, sender);
|
||||
public FriendMessageEvent(@NotNull Bot bot, @NotNull QQ sender, @NotNull MessageChain messageChain) {
|
||||
super(bot, sender);
|
||||
this.messageChain = Objects.requireNonNull(messageChain);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
package net.mamoe.mirai.event.events.robot;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.event.MiraiEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public abstract class RobotEvent extends MiraiEvent {
|
||||
private final Robot robot;
|
||||
|
||||
public RobotEvent(@NotNull Robot robot) {
|
||||
this.robot = Objects.requireNonNull(robot);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Robot getRobot() {
|
||||
return robot;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package net.mamoe.mirai.event.events.robot
|
||||
|
||||
import net.mamoe.mirai.Robot
|
||||
import net.mamoe.mirai.event.MiraiEvent
|
||||
|
||||
/**
|
||||
* @author Him188moe
|
||||
*/
|
||||
class RobotLoginEvent(val robot: Robot) : MiraiEvent()
|
||||
|
||||
class RobotLogoutEvent(val robot: Robot) : MiraiEvent()
|
||||
|
||||
class RobotMessageReceivedEvent(val robot: Robot, val type: Type, val message: String) : MiraiEvent() {
|
||||
enum class Type {
|
||||
FRIEND,
|
||||
GROUP
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package net.mamoe.mirai.event.events.robot;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
|
||||
public final class RobotLoginSucceedEvent extends RobotEvent {
|
||||
|
||||
public RobotLoginSucceedEvent(Robot robot) {
|
||||
super(robot);
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
@file:JvmMultifileClass
|
||||
@file:JvmName("RobotNetworkHandler")
|
||||
@file:JvmName("BotNetworkHandler")
|
||||
|
||||
package net.mamoe.mirai.network
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.MiraiServer
|
||||
import net.mamoe.mirai.Robot
|
||||
import net.mamoe.mirai.contact.Group
|
||||
import net.mamoe.mirai.contact.QQ
|
||||
import net.mamoe.mirai.event.events.bot.BotLoginSucceedEvent
|
||||
import net.mamoe.mirai.event.events.network.BeforePacketSendEvent
|
||||
import net.mamoe.mirai.event.events.network.PacketSentEvent
|
||||
import net.mamoe.mirai.event.events.network.ServerPacketReceivedEvent
|
||||
import net.mamoe.mirai.event.events.qq.FriendMessageEvent
|
||||
import net.mamoe.mirai.event.events.robot.RobotLoginSucceedEvent
|
||||
import net.mamoe.mirai.event.hookWhile
|
||||
import net.mamoe.mirai.message.Message
|
||||
import net.mamoe.mirai.message.defaults.MessageChain
|
||||
import net.mamoe.mirai.network.RobotNetworkHandler.*
|
||||
import net.mamoe.mirai.network.BotNetworkHandler.*
|
||||
import net.mamoe.mirai.network.packet.*
|
||||
import net.mamoe.mirai.network.packet.action.*
|
||||
import net.mamoe.mirai.network.packet.login.*
|
||||
@@ -36,9 +36,9 @@ import kotlin.reflect.KClass
|
||||
|
||||
/**
|
||||
* Mirai 的网络处理器, 它处理所有数据包([Packet])的发送和接收.
|
||||
* [RobotNetworkHandler] 是全程异步和线程安全的.
|
||||
* [BotNetworkHandler] 是全程异步和线程安全的.
|
||||
*
|
||||
* [RobotNetworkHandler] 由 2 个模块构成:
|
||||
* [BotNetworkHandler] 由 2 个模块构成:
|
||||
* - [SocketHandler]: 处理数据包底层的发送([ByteArray])
|
||||
* - [PacketHandler]: 制作 [Packet] 并传递给 [SocketHandler] 继续处理; 分析来自服务器的数据包并处理
|
||||
*
|
||||
@@ -48,12 +48,12 @@ import kotlin.reflect.KClass
|
||||
* - [MessageHandler] 处理消息相关(群消息/好友消息)([ServerEventPacket])
|
||||
* - [ActionHandler] 处理动作相关(踢人/加入群/好友列表等)
|
||||
*
|
||||
* A RobotNetworkHandler is used to connect with Tencent servers.
|
||||
* A BotNetworkHandler is used to connect with Tencent servers.
|
||||
*
|
||||
* @author Him188moe
|
||||
*/
|
||||
@Suppress("EXPERIMENTAL_API_USAGE")//to simplify code
|
||||
class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
class BotNetworkHandler(private val bot: Bot) : Closeable {
|
||||
private val socketHandler: SocketHandler = SocketHandler()
|
||||
|
||||
val debugHandler = DebugHandler()
|
||||
@@ -105,7 +105,7 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
return
|
||||
}
|
||||
|
||||
this@RobotNetworkHandler.socketHandler.touch(ip, touchingTimeoutMillis).get().let { state ->
|
||||
this@BotNetworkHandler.socketHandler.touch(ip, touchingTimeoutMillis).get().let { state ->
|
||||
if (state == LoginState.UNKNOWN || state == LoginState.TIMEOUT) {
|
||||
login()
|
||||
} else {
|
||||
@@ -126,13 +126,13 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
packet.decode()
|
||||
} catch (e: java.lang.Exception) {
|
||||
e.printStackTrace()
|
||||
robot.debug("Packet=$packet")
|
||||
robot.debug("Packet size=" + packet.input.goto(0).readAllBytes().size)
|
||||
robot.debug("Packet data=" + packet.input.goto(0).readAllBytes().toUHexString())
|
||||
bot.debug("Packet=$packet")
|
||||
bot.debug("Packet size=" + packet.input.goto(0).readAllBytes().size)
|
||||
bot.debug("Packet data=" + packet.input.goto(0).readAllBytes().toUHexString())
|
||||
return
|
||||
}
|
||||
|
||||
if (ServerPacketReceivedEvent(robot, packet).broadcast().isCancelled) {
|
||||
if (ServerPacketReceivedEvent(bot, packet).broadcast().isCancelled) {
|
||||
debugHandler.onPacketReceived(packet)
|
||||
return
|
||||
}
|
||||
@@ -186,14 +186,14 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
* Start network and touch the server
|
||||
*/
|
||||
internal fun touch(serverAddress: String, timeoutMillis: Long): CompletableFuture<LoginState> {
|
||||
robot.info("Connecting server: $serverAddress")
|
||||
bot.info("Connecting server: $serverAddress")
|
||||
this.loginFuture = CompletableFuture()
|
||||
|
||||
socketHandler.serverIP = serverAddress
|
||||
waitForPacket(ServerPacket::class, timeoutMillis) {
|
||||
loginFuture!!.complete(LoginState.TIMEOUT)
|
||||
}
|
||||
sendPacket(ClientTouchPacket(robot.account.qqNumber, socketHandler.serverIP))
|
||||
sendPacket(ClientTouchPacket(bot.account.qqNumber, socketHandler.serverIP))
|
||||
|
||||
return this.loginFuture!!
|
||||
}
|
||||
@@ -212,15 +212,15 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
try {
|
||||
packet.encodePacket()
|
||||
|
||||
if (BeforePacketSendEvent(robot, packet).broadcast().isCancelled) {
|
||||
if (BeforePacketSendEvent(bot, packet).broadcast().isCancelled) {
|
||||
return
|
||||
}
|
||||
|
||||
val data = packet.toByteArray()
|
||||
socket!!.send(DatagramPacket(data, data.size))
|
||||
robot cyanL "Packet sent: $packet"
|
||||
bot cyanL "Packet sent: $packet"
|
||||
|
||||
PacketSentEvent(robot, packet).broadcast()
|
||||
PacketSentEvent(bot, packet).broadcast()
|
||||
} catch (e: Throwable) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
@@ -230,7 +230,7 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
internal fun <P : ServerPacket> waitForPacket(packetClass: KClass<P>, timeoutMillis: Long, timeout: () -> Unit) {
|
||||
var got = false
|
||||
ServerPacketReceivedEvent::class.hookWhile {
|
||||
if (packetClass.isInstance(it.packet) && it.robot == robot) {
|
||||
if (packetClass.isInstance(it.packet) && it.bot == bot) {
|
||||
got = true
|
||||
true
|
||||
} else {
|
||||
@@ -283,10 +283,10 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
inner class DebugHandler : PacketHandler() {
|
||||
override fun onPacketReceived(packet: ServerPacket) {
|
||||
if (!packet.javaClass.name.endsWith("Encrypted") && !packet.javaClass.name.endsWith("Raw")) {
|
||||
robot notice "Packet received: $packet"
|
||||
bot notice "Packet received: $packet"
|
||||
}
|
||||
if (packet is ServerEventPacket) {
|
||||
sendPacket(ClientMessageResponsePacket(robot.account.qqNumber, packet.packetId, sessionKey, packet.eventIdentity))
|
||||
sendPacket(ClientMessageResponsePacket(bot.account.qqNumber, packet.packetId, sessionKey, packet.eventIdentity))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -327,12 +327,12 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
if (packet.serverIP != null) {//redirection
|
||||
socketHandler.serverIP = packet.serverIP!!
|
||||
//connect(packet.serverIP!!)
|
||||
sendPacket(ClientServerRedirectionPacket(packet.serverIP!!, robot.account.qqNumber))
|
||||
sendPacket(ClientServerRedirectionPacket(packet.serverIP!!, bot.account.qqNumber))
|
||||
} else {//password submission
|
||||
this.loginIP = packet.loginIP
|
||||
this.loginTime = packet.loginTime
|
||||
this.token0825 = packet.token0825
|
||||
sendPacket(ClientPasswordSubmissionPacket(robot.account.qqNumber, robot.account.password, packet.loginTime, packet.loginIP, this.tgtgtKey, packet.token0825))
|
||||
sendPacket(ClientPasswordSubmissionPacket(bot.account.qqNumber, bot.account.password, packet.loginTime, packet.loginIP, this.tgtgtKey, packet.token0825))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,7 +344,7 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
is ServerVerificationCodeCorrectPacket -> {
|
||||
this.tgtgtKey = getRandomByteArray(16)
|
||||
this.token00BA = packet.token00BA
|
||||
sendPacket(ClientLoginResendPacket3105(robot.account.qqNumber, robot.account.password, this.loginTime, this.loginIP, this.tgtgtKey, this.token0825, this.token00BA))
|
||||
sendPacket(ClientLoginResendPacket3105(bot.account.qqNumber, bot.account.password, this.loginTime, this.loginIP, this.tgtgtKey, this.token0825, this.token00BA))
|
||||
}
|
||||
|
||||
is ServerLoginResponseVerificationCodeInitPacket -> {
|
||||
@@ -354,13 +354,13 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
|
||||
if (packet.unknownBoolean != null && packet.unknownBoolean!!) {
|
||||
this.captchaSectionId = 1
|
||||
sendPacket(ClientVerificationCodeTransmissionRequestPacket(1, robot.account.qqNumber, this.token0825, this.captchaSectionId++, this.token00BA))
|
||||
sendPacket(ClientVerificationCodeTransmissionRequestPacket(1, bot.account.qqNumber, this.token0825, this.captchaSectionId++, this.token00BA))
|
||||
}
|
||||
}
|
||||
|
||||
is ServerVerificationCodeTransmissionPacket -> {
|
||||
if (packet is ServerVerificationCodeWrongPacket) {
|
||||
robot error "验证码错误, 请重新输入"
|
||||
bot error "验证码错误, 请重新输入"
|
||||
captchaSectionId = 1
|
||||
this.captchaCache = byteArrayOf()
|
||||
}
|
||||
@@ -369,31 +369,31 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
this.token00BA = packet.token00BA
|
||||
|
||||
if (packet.transmissionCompleted) {
|
||||
robot notice (CharImageUtil.createCharImg(ImageIO.read(this.captchaCache!!.inputStream())))
|
||||
robot notice ("需要验证码登录, 验证码为 4 字母")
|
||||
bot notice (CharImageUtil.createCharImg(ImageIO.read(this.captchaCache!!.inputStream())))
|
||||
bot notice ("需要验证码登录, 验证码为 4 字母")
|
||||
try {
|
||||
(MiraiServer.getInstance().parentFolder + "VerificationCode.png").writeBytes(this.captchaCache!!)
|
||||
robot notice ("若看不清字符图片, 请查看 Mirai 根目录下 VerificationCode.png")
|
||||
bot notice ("若看不清字符图片, 请查看 Mirai 根目录下 VerificationCode.png")
|
||||
} catch (e: Exception) {
|
||||
robot notice "无法写出验证码文件, 请尝试查看以上字符图片"
|
||||
bot notice "无法写出验证码文件, 请尝试查看以上字符图片"
|
||||
}
|
||||
robot notice ("若要更换验证码, 请直接回车")
|
||||
bot notice ("若要更换验证码, 请直接回车")
|
||||
val code = Scanner(System.`in`).nextLine()
|
||||
if (code.isEmpty() || code.length != 4) {
|
||||
this.captchaCache = byteArrayOf()
|
||||
this.captchaSectionId = 1
|
||||
sendPacket(ClientVerificationCodeRefreshPacket(packet.packetIdLast + 1, robot.account.qqNumber, token0825))
|
||||
sendPacket(ClientVerificationCodeRefreshPacket(packet.packetIdLast + 1, bot.account.qqNumber, token0825))
|
||||
} else {
|
||||
sendPacket(ClientVerificationCodeSubmitPacket(packet.packetIdLast + 1, robot.account.qqNumber, token0825, code, packet.verificationToken))
|
||||
sendPacket(ClientVerificationCodeSubmitPacket(packet.packetIdLast + 1, bot.account.qqNumber, token0825, code, packet.verificationToken))
|
||||
}
|
||||
} else {
|
||||
sendPacket(ClientVerificationCodeTransmissionRequestPacket(packet.packetIdLast + 1, robot.account.qqNumber, token0825, captchaSectionId++, token00BA))
|
||||
sendPacket(ClientVerificationCodeTransmissionRequestPacket(packet.packetIdLast + 1, bot.account.qqNumber, token0825, captchaSectionId++, token00BA))
|
||||
}
|
||||
}
|
||||
|
||||
is ServerLoginResponseSuccessPacket -> {
|
||||
this.sessionResponseDecryptionKey = packet.sessionResponseDecryptionKey
|
||||
sendPacket(ClientSessionRequestPacket(robot.account.qqNumber, socketHandler.serverIP, packet.token38, packet.token88, packet.encryptionKey, this.tlv0105))
|
||||
sendPacket(ClientSessionRequestPacket(bot.account.qqNumber, socketHandler.serverIP, packet.token38, packet.token88, packet.encryptionKey, this.tlv0105))
|
||||
}
|
||||
|
||||
//是ClientPasswordSubmissionPacket之后服务器回复的
|
||||
@@ -404,10 +404,10 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
//}
|
||||
if (packet.flag == ServerLoginResponseKeyExchangePacket.Flag.`08 36 31 03`) {
|
||||
this.tgtgtKey = packet.tgtgtKey
|
||||
sendPacket(ClientLoginResendPacket3104(robot.account.qqNumber, robot.account.password, loginTime, loginIP, tgtgtKey, token0825, packet.tokenUnknown
|
||||
sendPacket(ClientLoginResendPacket3104(bot.account.qqNumber, bot.account.password, loginTime, loginIP, tgtgtKey, token0825, packet.tokenUnknown
|
||||
?: this.token00BA, packet.tlv0006))
|
||||
} else {
|
||||
sendPacket(ClientLoginResendPacket3106(robot.account.qqNumber, robot.account.password, loginTime, loginIP, tgtgtKey, token0825, packet.tokenUnknown
|
||||
sendPacket(ClientLoginResendPacket3106(bot.account.qqNumber, bot.account.password, loginTime, loginIP, tgtgtKey, token0825, packet.tokenUnknown
|
||||
?: token00BA, packet.tlv0006))
|
||||
}
|
||||
}
|
||||
@@ -415,10 +415,10 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
is ServerSessionKeyResponsePacket -> {
|
||||
sessionKey = packet.sessionKey
|
||||
heartbeatFuture = MiraiThreadPool.getInstance().scheduleWithFixedDelay({
|
||||
sendPacket(ClientHeartbeatPacket(robot.account.qqNumber, sessionKey))
|
||||
sendPacket(ClientHeartbeatPacket(bot.account.qqNumber, sessionKey))
|
||||
}, 90000, 90000, TimeUnit.MILLISECONDS)
|
||||
|
||||
RobotLoginSucceedEvent(robot).broadcast()
|
||||
BotLoginSucceedEvent(bot).broadcast()
|
||||
|
||||
//登录成功后会收到大量上次的消息, 忽略掉
|
||||
MiraiThreadPool.getInstance().schedule({
|
||||
@@ -426,24 +426,24 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
}, 2, TimeUnit.SECONDS)
|
||||
|
||||
this.tlv0105 = packet.tlv0105
|
||||
sendPacket(ClientChangeOnlineStatusPacket(robot.account.qqNumber, sessionKey, ClientLoginStatus.ONLINE))
|
||||
sendPacket(ClientChangeOnlineStatusPacket(bot.account.qqNumber, sessionKey, ClientLoginStatus.ONLINE))
|
||||
}
|
||||
|
||||
is ServerLoginSuccessPacket -> {
|
||||
socketHandler.loginFuture!!.complete(LoginState.SUCCESS)
|
||||
sendPacket(ClientSKeyRequestPacket(robot.account.qqNumber, sessionKey))
|
||||
sendPacket(ClientSKeyRequestPacket(bot.account.qqNumber, sessionKey))
|
||||
}
|
||||
|
||||
is ServerSKeyResponsePacket -> {
|
||||
actionHandler.sKey = packet.sKey
|
||||
actionHandler.cookies = "uin=o" + robot.account.qqNumber + ";skey=" + actionHandler.sKey + ";"
|
||||
actionHandler.cookies = "uin=o" + bot.account.qqNumber + ";skey=" + actionHandler.sKey + ";"
|
||||
|
||||
sKeyRefresherFuture = MiraiThreadPool.getInstance().scheduleWithFixedDelay({
|
||||
sendPacket(ClientSKeyRefreshmentRequestPacket(robot.account.qqNumber, sessionKey))
|
||||
sendPacket(ClientSKeyRefreshmentRequestPacket(bot.account.qqNumber, sessionKey))
|
||||
}, 1800000, 1800000, TimeUnit.MILLISECONDS)
|
||||
|
||||
actionHandler.gtk = getGTK(actionHandler.sKey)
|
||||
sendPacket(ClientAccountInfoRequestPacket(robot.account.qqNumber, sessionKey))
|
||||
sendPacket(ClientAccountInfoRequestPacket(bot.account.qqNumber, sessionKey))
|
||||
}
|
||||
|
||||
is ServerEventPacket.Raw -> distributePacket(packet.distribute())
|
||||
@@ -514,12 +514,12 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
return
|
||||
}
|
||||
|
||||
FriendMessageEvent(robot, robot.contacts.getQQ(packet.qq), packet.message).broadcast()
|
||||
FriendMessageEvent(bot, bot.contacts.getQQ(packet.qq), packet.message).broadcast()
|
||||
}
|
||||
|
||||
is ServerGroupMessageEventPacket -> {
|
||||
//todo message chain
|
||||
//GroupMessageEvent(this.robot, robot.contacts.getGroupByNumber(packet.groupNumber), robot.contacts.getQQ(packet.qq), packet.message)
|
||||
//GroupMessageEvent(this.bot, bot.contacts.getGroupByNumber(packet.groupNumber), bot.contacts.getQQ(packet.qq), packet.message)
|
||||
}
|
||||
|
||||
is UnknownServerEventPacket -> {
|
||||
@@ -537,12 +537,12 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
}
|
||||
|
||||
fun sendFriendMessage(qq: QQ, message: MessageChain) {
|
||||
sendPacket(ClientSendFriendMessagePacket(robot.account.qqNumber, qq.number, sessionKey, message))
|
||||
sendPacket(ClientSendFriendMessagePacket(bot.account.qqNumber, qq.number, sessionKey, message))
|
||||
}
|
||||
|
||||
fun sendGroupMessage(group: Group, message: Message): Unit {
|
||||
TODO()
|
||||
//sendPacket(ClientSendGroupMessagePacket(group.groupId, robot.account.qqNumber, sessionKey, message))
|
||||
//sendPacket(ClientSendGroupMessagePacket(group.groupId, bot.account.qqNumber, sessionKey, message))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -620,7 +620,7 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
}
|
||||
|
||||
ServerCanAddFriendResponsePacket.State.REQUIRE_VERIFICATION -> {
|
||||
sendPacket(ClientAddFriendPacket(robot.account.qqNumber, qq, sessionKey))
|
||||
sendPacket(ClientAddFriendPacket(bot.account.qqNumber, qq, sessionKey))
|
||||
}
|
||||
|
||||
ServerCanAddFriendResponsePacket.State.NOT_REQUIRE_VERIFICATION -> {
|
||||
@@ -634,7 +634,7 @@ class RobotNetworkHandler(private val robot: Robot) : Closeable {
|
||||
}
|
||||
|
||||
fun sendAddRequest() {
|
||||
sendPacket(ClientCanAddFriendPacket(robot.account.qqNumber, qq, sessionKey).also { this.id = it.packetIdLast })
|
||||
sendPacket(ClientCanAddFriendPacket(bot.account.qqNumber, qq, sessionKey).also { this.id = it.packetIdLast })
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
|
||||
@@ -15,7 +15,7 @@ import java.util.*
|
||||
@PacketId("00 A7")
|
||||
@ExperimentalUnsignedTypes
|
||||
class ClientCanAddFriendPacket(
|
||||
val robot: Long,
|
||||
val bot: Long,
|
||||
val qq: Long,
|
||||
val sessionKey: ByteArray
|
||||
) : ClientPacket() {
|
||||
@@ -28,7 +28,7 @@ class ClientCanAddFriendPacket(
|
||||
override fun encode() {
|
||||
this.write(packetIdLast)//id, 2bytes
|
||||
|
||||
this.writeQQ(robot)
|
||||
this.writeQQ(bot)
|
||||
this.writeHex(Protocol.fixVer2)
|
||||
this.encryptAndWrite(sessionKey) {
|
||||
it.writeQQ(qq)
|
||||
@@ -79,7 +79,7 @@ class ServerCanAddFriendResponsePacket(input: DataInputStream) : ServerPacket(in
|
||||
@PacketId("00 AE")
|
||||
@ExperimentalUnsignedTypes
|
||||
class ClientAddFriendPacket(
|
||||
val robot: Long,
|
||||
val bot: Long,
|
||||
val qq: Long,
|
||||
val sessionKey: ByteArray
|
||||
) : ClientPacket() {
|
||||
@@ -92,7 +92,7 @@ class ClientAddFriendPacket(
|
||||
override fun encode() {
|
||||
this.write(packetIdLast)//id, 2bytes
|
||||
|
||||
this.writeQQ(robot)
|
||||
this.writeQQ(bot)
|
||||
this.writeHex(Protocol.fixVer2)
|
||||
this.encryptAndWrite(sessionKey) {
|
||||
it.writeHex("01 00 01")
|
||||
|
||||
@@ -12,22 +12,22 @@ import java.io.DataInputStream
|
||||
@PacketId("00 CD")
|
||||
@ExperimentalUnsignedTypes
|
||||
class ClientSendFriendMessagePacket(
|
||||
private val robotQQ: Long,
|
||||
private val botQQ: Long,
|
||||
private val targetQQ: Long,
|
||||
private val sessionKey: ByteArray,
|
||||
private val message: MessageChain
|
||||
) : ClientPacket() {
|
||||
override fun encode() {
|
||||
this.writeRandom(2)//part of packet id
|
||||
this.writeQQ(robotQQ)
|
||||
this.writeQQ(botQQ)
|
||||
this.writeHex(Protocol.fixVer2)
|
||||
|
||||
this.encryptAndWrite(sessionKey) {
|
||||
it.writeQQ(robotQQ)
|
||||
it.writeQQ(botQQ)
|
||||
it.writeQQ(targetQQ)
|
||||
it.writeHex("00 00 00 08 00 01 00 04 00 00 00 00")
|
||||
it.writeHex("37 0F")
|
||||
it.writeQQ(robotQQ)
|
||||
it.writeQQ(botQQ)
|
||||
it.writeQQ(targetQQ)
|
||||
it.write(md5(lazyEncode { md5Key -> md5Key.writeQQ(targetQQ); md5Key.write(sessionKey) }))
|
||||
it.writeHex("00 0B")
|
||||
|
||||
@@ -12,13 +12,13 @@ import java.io.DataInputStream
|
||||
@ExperimentalUnsignedTypes
|
||||
class ClientSendGroupMessagePacket(
|
||||
private val groupId: Long,//不是 number
|
||||
private val robotQQ: Long,
|
||||
private val botQQ: Long,
|
||||
private val sessionKey: ByteArray,
|
||||
private val message: String
|
||||
) : ClientPacket() {
|
||||
override fun encode() {
|
||||
this.writeRandom(2)//part of packet id
|
||||
this.writeQQ(robotQQ)
|
||||
this.writeQQ(botQQ)
|
||||
this.writeHex(Protocol.fixVer2)
|
||||
|
||||
this.encryptAndWrite(sessionKey) {
|
||||
|
||||
@@ -39,7 +39,7 @@ class ServerLoginResponseKeyExchangePacket(input: DataInputStream, val flag: Fla
|
||||
|
||||
Flag.OTHER -> {
|
||||
//do nothing in this packet.
|
||||
//[this.token] will be set in [RobotNetworkHandler]
|
||||
//[this.token] will be set in [BotNetworkHandler]
|
||||
//token
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package net.mamoe.mirai.plugin;
|
||||
|
||||
import net.mamoe.mirai.Robot;
|
||||
import net.mamoe.mirai.Bot;
|
||||
|
||||
/**
|
||||
* 插件基类.
|
||||
* <p>
|
||||
* 插件属于整个 Mirai, 而不是属于单个 {@link Robot}.
|
||||
* 插件属于整个 Mirai, 而不是属于单个 {@link Bot}.
|
||||
*
|
||||
* @see net.mamoe.mirai.event.MiraiEventManager
|
||||
* @see net.mamoe.mirai.event.MiraiEventManagerKt
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package net.mamoe.mirai.utils
|
||||
|
||||
import net.mamoe.mirai.Robot
|
||||
import net.mamoe.mirai.Bot
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
@@ -36,27 +36,27 @@ object MiraiLogger {
|
||||
}
|
||||
}
|
||||
|
||||
infix fun Robot.log(o: Any?) = info(o)
|
||||
infix fun Robot.println(o: Any?) = info(o)
|
||||
infix fun Robot.info(o: Any?) = print(this, o.toString(), LoggerTextFormat.RESET)
|
||||
infix fun Bot.log(o: Any?) = info(o)
|
||||
infix fun Bot.println(o: Any?) = info(o)
|
||||
infix fun Bot.info(o: Any?) = print(this, o.toString(), LoggerTextFormat.RESET)
|
||||
|
||||
infix fun Robot.error(o: Any?) = print(this, o.toString(), LoggerTextFormat.RED)
|
||||
infix fun Bot.error(o: Any?) = print(this, o.toString(), LoggerTextFormat.RED)
|
||||
|
||||
infix fun Robot.notice(o: Any?) = print(this, o.toString(), LoggerTextFormat.LIGHT_BLUE)
|
||||
infix fun Bot.notice(o: Any?) = print(this, o.toString(), LoggerTextFormat.LIGHT_BLUE)
|
||||
|
||||
infix fun Robot.purple(o: Any?) = print(this, o.toString(), LoggerTextFormat.PURPLE)
|
||||
infix fun Bot.purple(o: Any?) = print(this, o.toString(), LoggerTextFormat.PURPLE)
|
||||
|
||||
infix fun Robot.cyanL(o: Any?) = print(this, o.toString(), LoggerTextFormat.LIGHT_CYAN)
|
||||
infix fun Bot.cyanL(o: Any?) = print(this, o.toString(), LoggerTextFormat.LIGHT_CYAN)
|
||||
|
||||
infix fun Robot.success(o: Any?) = print(this, o.toString(), LoggerTextFormat.GREEN)
|
||||
infix fun Bot.success(o: Any?) = print(this, o.toString(), LoggerTextFormat.GREEN)
|
||||
|
||||
infix fun Robot.debug(o: Any?) = print(this, o.toString(), LoggerTextFormat.YELLOW)
|
||||
infix fun Bot.debug(o: Any?) = print(this, o.toString(), LoggerTextFormat.YELLOW)
|
||||
|
||||
|
||||
@Synchronized
|
||||
private fun print(robot: Robot, value: String?, color: LoggerTextFormat = LoggerTextFormat.WHITE) {
|
||||
private fun print(bot: Bot, value: String?, color: LoggerTextFormat = LoggerTextFormat.WHITE) {
|
||||
val s = SimpleDateFormat("MM-dd HH:mm:ss").format(Date())
|
||||
kotlin.io.println("$color[Mirai] $s #R${robot.id}: $value")
|
||||
kotlin.io.println("$color[Mirai] $s #R${bot.id}: $value")
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,11 +6,11 @@ import lombok.Data;
|
||||
* @author Him188moe
|
||||
*/
|
||||
@Data
|
||||
public final class RobotAccount {
|
||||
public final class BotAccount {
|
||||
public final long qqNumber;
|
||||
public final String password;
|
||||
|
||||
public RobotAccount(long qqNumber, String password) {
|
||||
public BotAccount(long qqNumber, String password) {
|
||||
this.qqNumber = qqNumber;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import net.mamoe.mirai.Robot
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.network.packet.login.LoginState
|
||||
import net.mamoe.mirai.utils.RobotAccount
|
||||
import net.mamoe.mirai.utils.BotAccount
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
@@ -64,21 +64,21 @@ val qqList = "2535777366----abc123456\n" +
|
||||
|
||||
|
||||
fun main() {
|
||||
val goodRobotList = Collections.synchronizedList(mutableListOf<Robot>())
|
||||
val goodBotList = Collections.synchronizedList(mutableListOf<Bot>())
|
||||
|
||||
qqList.split("\n").forEach {
|
||||
GlobalScope.launch {
|
||||
val strings = it.split("----")
|
||||
val robot = Robot(RobotAccount(strings[0].toLong(), strings[1].let { password ->
|
||||
val bot = Bot(BotAccount(strings[0].toLong(), strings[1].let { password ->
|
||||
if (password.endsWith(".")) {
|
||||
return@let password.substring(0, password.length - 1)
|
||||
}
|
||||
return@let password
|
||||
}), listOf())
|
||||
|
||||
robot.network.tryLogin().whenComplete { state, _ ->
|
||||
bot.network.tryLogin().whenComplete { state, _ ->
|
||||
if (!(state == LoginState.BLOCKED || state == LoginState.DEVICE_LOCK || state == LoginState.WRONG_PASSWORD)) {
|
||||
goodRobotList.add(robot)
|
||||
goodBotList.add(bot)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -86,5 +86,5 @@ fun main() {
|
||||
|
||||
Thread.sleep(9 * 3000)
|
||||
|
||||
println(goodRobotList.joinToString("\n") { it.account.qqNumber.toString() + " " + it.account.password })
|
||||
println(goodBotList.joinToString("\n") { it.account.qqNumber.toString() + " " + it.account.password })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user