Commit 114604f2 authored by Him188moe's avatar Him188moe

Renamed `robot` to `bot`

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