LinuxGSM icon indicating copy to clipboard operation
LinuxGSM copied to clipboard

Update feature : Online players check

Open 1stian opened this issue 9 years ago • 19 comments

Hi,

I would like to see a feature that checks for online players on the server before it starts the update. If there are players online. We can have a choice of letting them know it will be updated in 5 mins or so. Or just abort the update and recheck later.

I think this will be really nice to have.

This is not really a issue more like a feature request. Thanks.

1stian avatar Apr 22 '16 16:04 1stian

I agree that would be a nice idea. Should be possible however Im not sure how to implement this yet.

dgibbs64 avatar Apr 22 '16 19:04 dgibbs64

http://steamcommunity.com/groups/linuxgsm/discussions/0/364039531228165077/

Quotation from myself : "This would require to query the server and get the amount of players on it. I's an interesting idea but would be quite hard to do."

UltimateByte avatar Apr 22 '16 19:04 UltimateByte

@UltimateByte @dgibbs64 Yes. Querying a server from a script is not the easiest thing to do I guess. Anyway... I can experiment a little. By creating something that will run your update script, when the server is empty.. if I even are able to do that at all..

Anyway I hope it will be implemented if you have time or can ofc :)

Thanks.

1stian avatar Apr 22 '16 21:04 1stian

Once again, Cedar has a clever idea about this : using "stats" command.

4:20 - CedarLUG: How to get # of players in (half life) game [referencing the github discussion[: 4:21 - CedarLUG: length=$(wc -l log/console/fof-server-console.log | awk '{print $1}') 4:21 - CedarLUG: tmux send-keys -t fof-server C-a C-k status Enter 4:21 - CedarLUG: tail -n+${length} log/console/fof-server-console.log | grep player | grep humans | tail -1 | awk -F"humans" '{print $1}' | cut -d: -f2 4:21 - CedarLUG: Probably a better way, but that's my first pass. 4:22 - CedarLUG: Works for CSGO, TF2, Fistful of Frags, etc. 4:28 - CedarLUG: the length captures the current size of the log file. 4:28 - CedarLUG: The tmux command issues C-a first (to set the cursor at the front of the line) 4:28 - CedarLUG: Then C-k to kill to the end of the line 4:29 - CedarLUG: (In case there's cruft on the line as described once by jballou) 4:29 - CedarLUG: Then issues "status" 4:29 - CedarLUG: That dumps to the console log, so the next part pulls the number of humans on the server. 4:30 - CedarLUG: The "tail -n+${length}" grabs only the log content that's "grown" since the length was set. 4:30 - CedarLUG: That's so that you don't parse the whole big file. 4:30 - CedarLUG: But there is a chance that another status was issued, so take the last one (tail -1) 4:31 - CedarLUG: parse it for player (not needed, but I had it in there) 4:31 - CedarLUG: and then cut the part of the line before "human" but after "players :" 4:31 - CedarLUG: That's the number of players currently tapped in. 4:31 - CedarLUG: Ez.

UltimateByte avatar Apr 28 '16 11:04 UltimateByte

I use SteamCondenser in my stuff, but for a basic rcon implementation (in Node.js but easy to read), see https://github.com/randunel/node-srcds-rcon - we may want to create a function for rcon commands and use that to send and receive data to game instances. Using command stuffing and log scraping seems like a hacky approach. If I have some time (ha ha), I might try to add something like this.

jaredballou avatar May 09 '16 17:05 jaredballou

Also, there is this. I am using it to add these features to my forked gsquery.py: https://github.com/Dasister/Source-Query-Class-Python/blob/master/QueryClass.py

jaredballou avatar May 19 '16 20:05 jaredballou

Node-Gamedig is now supported. This feature should now be possible

dgibbs64 avatar Jun 15 '18 22:06 dgibbs64

#647 related

dgibbs64 avatar Jun 16 '18 14:06 dgibbs64

Monitor has had a refactor and gamedig is better supported. This feature can now be developed for any game server that supports gamedig. However, will have to check results with bots

dgibbs64 avatar Nov 25 '19 12:11 dgibbs64

gamedig support is much better in linuxgsm now. I will finally be looking to implement this functionality.

dgibbs64 avatar Sep 24 '21 21:09 dgibbs64

gamedig support is much better in linuxgsm now. I will finally be looking to implement this functionality.

Oh wow! That would be awesome! Totally forgot about this... Been using LinuxGSM for years.. So this would be great! Thanks!

1stian avatar Sep 24 '21 22:09 1stian

Oh wow! That would be awesome! Totally forgot about this... Been using LinuxGSM for years.. So this would be great! Thanks! Yeah I forgot about this and I have been developing LinuxGSM for years 😄

dgibbs64 avatar Sep 24 '21 22:09 dgibbs64

So I am looking at this issue and so far I have gone with if players on the server then the server will not stop. This will cover all eventualities of stopping the server when a command is run. However the only issue is that an admin might WANT the server to stop even if players are still on the server. I am unsure how best to handle that

dgibbs64 avatar Feb 28 '24 20:02 dgibbs64

I think the most important thing is not to change the current default of stopping / restarting / updating the server even when players are connected to avoid breaking current setups.

So a new setting to choose whether to "force" / "wait for no players online" is probably needed. The default being to force stopping the server.

If an admin sets this to "wait for no players online" in the config, LinuxGSM users should be promoted when players are online to make sure they want to stop the server anyway. This behaviour should be overridable by adding an argument like ./gameserver restart force for automation.

This way, admins who want this functionality will also see any hints from the _default.cfg notifying them of breaking cronjobs if they decide to enable the feature.

Also it might be helpful to send alerts when stopping the server is delayed because of online players.

link #3676

MicLieg avatar Feb 28 '24 21:02 MicLieg

there will be a new var stoponlyifnoplayers="off" for admins to enable if they want.

I have just added some other functionality that if the server is blocked from restarting it will create a restart-request.lock file. When monitor is run it will check for this file and trigger a restart (if no players). This is useful if there is a daily restart cron that happens to run while players are on the server. It will ensure that the server will eventually be restarted.

Update will also only happen if no players are present. I expect as updates are released players will naturally drop off allowing the server to update itself without disturbing a running game.

I think adding force-restart and force-stop will also be needed.

Unsure on how to handle alerts currently but will give it some thought.

dgibbs64 avatar Feb 28 '24 21:02 dgibbs64

Sounds good!

I expect as updates are released players will naturally drop off allowing the server to update itself without disturbing a running game.

Perhaps this can also be achieved by adding a maxstopdelay var to the config, forcing the server to restart, stop or update after the desired period of time.

MicLieg avatar Feb 28 '24 22:02 MicLieg

So there a a few scenarios to this

  1. stop command will not stop the server if players are on the server
  2. restart command will postpone a restart of the server if players on the server (lock file is created). Monitor will check for an empty server and then force a restart.
  3. update command will not update if players are on the server (lock file is created). Monitor will check for an empty server and then force an update.

Edit: add timeout setting to force restart after X mintues

dgibbs64 avatar Jun 16 '24 20:06 dgibbs64

Tanks for your effort! @dgibbs64

I still think it might be useful to be able to set a grace period in the config, after which a restart, stop or update is forced even if players are connected. Otherwise, a daily restart will be impossible in some cases, as some players will stay AFK/online overnight.

MicLieg avatar Jun 17 '24 08:06 MicLieg

I agree I will add that functionality

dgibbs64 avatar Jun 17 '24 08:06 dgibbs64