mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
Provide reason for player leaving
Expose the reason for why a player is leaving a server in playerEvent.
This commit is contained in:
1 parent
8017497bdd
commit
db562ce6a0
5 files changed
+37
-10
No files matched your search
@@ -1284,10 +1284,12 @@ messages.playerEvent = new Event({
|
||||
type: "player_event",
|
||||
links: ["instance-slave", "slave-master"],
|
||||
forwardTo: "master",
|
||||
eventRequired: ["instance_id", "type", "name"],
|
||||
eventProperties: {
|
||||
"instance_id": { type: "integer" },
|
||||
"type": { type: "string", enum: ["join", "leave"] },
|
||||
"name": { type: "string" },
|
||||
"reason": { type: "string" },
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -208,6 +208,9 @@ class BaseInstancePlugin {
|
||||
* @param {Object} event - Information about the event.
|
||||
* @param {string} event.type - Either "join" or "leave".
|
||||
* @param {string} event.name - Name of the player that joined/left.
|
||||
* @param {string=} event.reason -
|
||||
* Only present for type "leave". Reason for player leaving the
|
||||
* game, one of the possible reasons in defines.disconnect_reason.
|
||||
*/
|
||||
async onPlayerEvent(event) { }
|
||||
|
||||
@@ -500,6 +503,9 @@ class BaseMasterPlugin {
|
||||
* @param {Object} event - Information about the event.
|
||||
* @param {string} event.type - Either "join" or "leave".
|
||||
* @param {string} event.name - Name of the player that joined/left.
|
||||
* @param {string=} event.reason -
|
||||
* Only present for type "leave". Reason for player leaving the
|
||||
* game, one of the possible reasons in defines.disconnect_reason.
|
||||
*/
|
||||
async onPlayerEvent(instance, event) { }
|
||||
|
||||
|
||||
@@ -28,9 +28,18 @@ impl.events[defines.events.on_player_joined_game] = function(event)
|
||||
api.send_json("player_event", { type = "join", name = player.name })
|
||||
end
|
||||
|
||||
local disconnect_reason_name = {}
|
||||
for name, i in pairs(defines.disconnect_reason) do
|
||||
disconnect_reason_name[i] = name
|
||||
end
|
||||
|
||||
impl.events[defines.events.on_player_left_game] = function(event)
|
||||
local player = game.players[event.player_index]
|
||||
api.send_json("player_event", { type = "leave", name = player.name })
|
||||
api.send_json("player_event", {
|
||||
type = "leave",
|
||||
name = player.name,
|
||||
reason = disconnect_reason_name[event.reason],
|
||||
})
|
||||
end
|
||||
|
||||
-- Internal API
|
||||
|
||||
@@ -250,7 +250,7 @@ class Instance extends libLink.Link {
|
||||
if (event.type === "join") {
|
||||
this._recordPlayerJoin(event.name);
|
||||
} else if (event.type === "leave") {
|
||||
this._recordPlayerLeave(event.name);
|
||||
this._recordPlayerLeave(event.name, event.reason);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -264,6 +264,9 @@ class Instance extends libLink.Link {
|
||||
* Unix timestamp in ms the player was last seen leaving this
|
||||
* instance. Not present if player has yet to leave after first
|
||||
* time joining.
|
||||
* @property {string=} lastLeaveReason -
|
||||
* Reason the player was last seen leaving with. Not present if
|
||||
* player has yet to leave after first time joining.
|
||||
* @property {number} joinCount -
|
||||
* Count of the number of times this player has been seen
|
||||
* joining this server.
|
||||
@@ -297,7 +300,12 @@ class Instance extends libLink.Link {
|
||||
if (parsed.action === "JOIN") {
|
||||
this._recordPlayerJoin(name);
|
||||
} else if (["LEAVE", "KICK", "BAN"].includes(parsed.action)) {
|
||||
this._recordPlayerLeave(name);
|
||||
let reason = {
|
||||
"LEAVE": "quit",
|
||||
"KICK": "kicked",
|
||||
"BAN": "banned",
|
||||
}[parsed.action];
|
||||
this._recordPlayerLeave(name, reason);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -322,7 +330,7 @@ class Instance extends libLink.Link {
|
||||
this.playersOnline.forEach(player => joined.delete(player));
|
||||
|
||||
for (let player of left) {
|
||||
this._recordPlayerLeave(player);
|
||||
this._recordPlayerLeave(player, "quit");
|
||||
}
|
||||
|
||||
// Missing join messages is not supposed to happen.
|
||||
@@ -358,13 +366,14 @@ class Instance extends libLink.Link {
|
||||
libPlugin.invokeHook(this.plugins, "onPlayerEvent", event);
|
||||
}
|
||||
|
||||
_recordPlayerLeave(name) {
|
||||
_recordPlayerLeave(name, reason) {
|
||||
if (!this.playersOnline.delete(name)) {
|
||||
return;
|
||||
}
|
||||
|
||||
let stats = this.playerStats.get(name);
|
||||
stats.lastLeaveAt = Date.now();
|
||||
stats.lastLeaveReason = reason;
|
||||
stats.onlineTimeMs += stats.lastLeaveAt - stats.lastJoinAt;
|
||||
this._hadPlayersOnline = true;
|
||||
|
||||
@@ -372,6 +381,7 @@ class Instance extends libLink.Link {
|
||||
instance_id: this.id,
|
||||
type: "leave",
|
||||
name,
|
||||
reason,
|
||||
};
|
||||
libLink.messages.playerEvent.send(this, event);
|
||||
libPlugin.invokeHook(this.plugins, "onPlayerEvent", event);
|
||||
|
||||
@@ -89,21 +89,21 @@ describe("class Instance", function() {
|
||||
|
||||
it("should send player_event", function() {
|
||||
instance._recordPlayerJoin("player");
|
||||
instance._recordPlayerLeave("player");
|
||||
instance._recordPlayerLeave("player", "quit");
|
||||
assert.deepEqual(
|
||||
connector.sentMessages[1],
|
||||
{
|
||||
seq: 2,
|
||||
type: "player_event_event",
|
||||
data: { type: "leave", instance_id: instance.id, name: "player" },
|
||||
data: { type: "leave", instance_id: instance.id, name: "player", reason: "quit" },
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it("should be idempotent", function() {
|
||||
instance._recordPlayerJoin("player");
|
||||
instance._recordPlayerLeave("player");
|
||||
instance._recordPlayerLeave("player");
|
||||
instance._recordPlayerLeave("player", "quit");
|
||||
instance._recordPlayerLeave("player", "quit");
|
||||
assert(!instance.playersOnline.has("player"), "player was not removed");
|
||||
assert.equal(connector.sentMessages.length, 2);
|
||||
});
|
||||
@@ -148,7 +148,7 @@ describe("class Instance", function() {
|
||||
{
|
||||
seq: 2,
|
||||
type: "player_event_event",
|
||||
data: { type: "leave", instance_id: instance.id, name: "player" },
|
||||
data: { type: "leave", instance_id: instance.id, name: "player", reason: "quit" },
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user