Иконка ресурса

FREE PlayTime : 2.0 2.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
/******************************************************************************
* Version 2.0 Changelog
*** Rewrote and cleaned up the plugin.*
*** Changed the method of logging time to log time every x minutes.*
*** Cleaned up the playtime command output.*
*** Cleaned up the lastseen command output.*
*** Cleaned up the mostonline command output.*
*** Added a message on login that says how long since the player last logged in.*
*** Fixed KeyNotFoundException when running lastseen on a user that doesn't exist.*
*** Added a prefix to all chat commands."Play Time"*
*** Added BroadcastLastSeenOnConnect to config, so the broadcast can be disabled if need be.*** Config will update with new values automatically in future updates.******************************************************************************/

using System.Collections.Generic;
using System;
using System.Linq;
using Oxide.Core;

namespace Oxide.Plugins
{
    [Info("PlayTime", "Waizujin", 2.0)]
    [Description("Logs players play time and allows you to view the players play time with a command.")]
    public class PlayTime : RustPlugin
    {
		public string Prefix = "<color=red>Play Time:</color> ";
		public int SaveInterval { get { return Config.Get<int>("Save Interval"); } }
		public bool BroadcastLastSeenOnConnect { get { return Config.Get<bool>("Broadcast Last Seen on Connect"); } }

		protected override void LoadDefaultConfig()
		{
			PrintWarning("Creating a new configuration file.");

			Config["Save Interval"] = 300;
			Config["Broadcast Last Seen on Connect"] = true;
		}

		class PlayTimeData
        {
            public Dictionary<string, PlayTimeInfo> Players = new Dictionary<string, PlayTimeInfo>();

            public PlayTimeData() {  }
        }

        class PlayTimeInfo
        {
            public string SteamID;
            public string Name;
            public long LastPlayTimeIncrement;
            public long LastLogoutTime;
            public long PlayTime;

            public PlayTimeInfo() {  }

            public PlayTimeInfo(BasePlayer player)
            {
                long currentTimestamp = GrabCurrentTimestamp();
                SteamID = player.userID.ToString();
                Name = player.displayName;
                LastPlayTimeIncrement = currentTimestamp;
                LastLogoutTime = 0;
                PlayTime = 0;
            }
        }

        PlayTimeData playTimeData;

        private void OnServerInitialized()
        {
			var dirty = false;

			if (Config["Save Interval"] == null)
			{
				Config["Save Interval"] = 300;
				dirty = true;
			}

			if (Config["Broadcast Last Seen on Connect"] == null)
			{
				Config["Broadcast Last Seen on Connect"] = true;
				dirty = true;
			}

			if (dirty)
			{
				PrintWarning("Updating configuration file with new values.");
				SaveConfig();
			}

			playTimeData = Interface.GetMod().DataFileSystem.ReadObject<PlayTimeData>("PlayTime");

            permission.RegisterPermission("canUsePlayTime", this);
            permission.RegisterPermission("canUseLastSeen", this);
            permission.RegisterPermission("canUseMostOnline", this);

            timer.Repeat(SaveInterval, 0, () => updatePlayTime());
        }

        void OnPlayerInit(BasePlayer player)
        {
			long currentTimestamp = GrabCurrentTimestamp();
			var info = new PlayTimeInfo(player);
			
			if (BroadcastLastSeenOnConnect)
			{
				long lastLogoutTime = playTimeData.Players[info.SteamID].LastLogoutTime;
				long lastSeenDays = 0;
				long lastSeenHours = 0;
				long lastSeenMinutes = 0;
				long lastSeenSeconds = currentTimestamp - lastLogoutTime;

				if (lastSeenSeconds > 60)
				{
					lastSeenMinutes = lastSeenSeconds / 60;
					lastSeenSeconds = lastSeenSeconds - (lastSeenMinutes * 60);
				}

				if (lastSeenMinutes > 60)
				{
					lastSeenHours = lastSeenMinutes / 60;
					lastSeenMinutes = lastSeenMinutes - (lastSeenHours * 60);
				}

				if (lastSeenHours > 24)
				{
					lastSeenDays = lastSeenHours / 24;
					lastSeenHours = lastSeenHours - (lastSeenDays * 24);
				}

				if (lastSeenDays > 0)
				{
					PrintToChat(Prefix + player.displayName + " was last seen " + lastSeenDays + " days " + lastSeenHours + " hours and " + lastSeenMinutes + " minutes ago.");
					Puts(player.displayName + " was last seen " + lastSeenDays + " days " + lastSeenHours + " hours and " + lastSeenMinutes + " minutes ago.");
				}
				else if (lastSeenHours > 0)
				{
					PrintToChat(Prefix + player.displayName + " was last seen " + lastSeenHours + " hours and " + lastSeenMinutes + " minutes ago.");
					Puts(player.displayName + " was last seen " + lastSeenDays + " days " + lastSeenHours + " hours and " + lastSeenMinutes + " minutes ago.");
				}
				else if (lastSeenMinutes > 0)
				{
					PrintToChat(Prefix + player.displayName + " was last seen " + lastSeenMinutes + " minutes ago.");
					Puts(player.displayName + " was last seen " + lastSeenDays + " days " + lastSeenHours + " hours and " + lastSeenMinutes + " minutes ago.");
				}
				else
				{
					PrintToChat(Prefix + player.displayName + " was last seen " + lastSeenSeconds + " seconds ago.");
					Puts(player.displayName + " was last seen " + lastSeenDays + " days " + lastSeenHours + " hours and " + lastSeenMinutes + " minutes ago.");
				}
			}

			if (playTimeData.Players.ContainsKey(info.SteamID))
			{
				Puts("Player already has a PlayTime log.");

				playTimeData.Players[info.SteamID].LastPlayTimeIncrement = currentTimestamp;
				playTimeData.Players[info.SteamID].Name = player.displayName;
			}
			else
			{
				Puts("Saving new player to PlayTime log.");
				playTimeData.Players.Add(info.SteamID, info);
			}

			Interface.GetMod().DataFileSystem.WriteObject("PlayTime", playTimeData);
        }

        void OnPlayerDisconnected(BasePlayer player)
        {
            long currentTimestamp = GrabCurrentTimestamp();
            var info = new PlayTimeInfo(player);

            long lastIncrement = playTimeData.Players[info.SteamID].LastPlayTimeIncrement;
            long totalPlayed = currentTimestamp - lastIncrement;

            playTimeData.Players[info.SteamID].PlayTime += totalPlayed;
            playTimeData.Players[info.SteamID].LastPlayTimeIncrement = currentTimestamp;
            playTimeData.Players[info.SteamID].LastLogoutTime = currentTimestamp;
            Interface.GetMod().DataFileSystem.WriteObject("PlayTime", playTimeData);
        }

        public void updatePlayTime()
        {
			Puts("Saving playtime data for all online users.");
            foreach (BasePlayer onlinePlayer in BasePlayer.activePlayerList)
            {
                long currentTimestamp = GrabCurrentTimestamp();
                long playerSteamID = FindPlayer(onlinePlayer.userID.ToString());

                if (playerSteamID == 0)
                {
					// No info in file, so lets initiate him.var info = new PlayTimeInfo(onlinePlayer);

					if (playTimeData.Players.ContainsKey(info.SteamID))
					{
						Puts("Player already has a PlayTime log.");

						playTimeData.Players[info.SteamID].LastPlayTimeIncrement = GrabCurrentTimestamp();
						playTimeData.Players[info.SteamID].Name = onlinePlayer.displayName;
					}
					else
					{
						Puts("Saving new player to PlayTime log.");
						playTimeData.Players.Add(info.SteamID, info);
					}

					Interface.GetMod().DataFileSystem.WriteObject("PlayTime", playTimeData);

					return;
                }

                if (onlinePlayer.userID.ToString() == playerSteamID.ToString())
                {
					string playerName = playTimeData.Players[playerSteamID.ToString()].Name;
					long playedTime = currentTimestamp - playTimeData.Players[playerSteamID.ToString()].LastPlayTimeIncrement;

                    playTimeData.Players[playerSteamID.ToString()].PlayTime += playedTime;
                    playTimeData.Players[playerSteamID.ToString()].LastPlayTimeIncrement = currentTimestamp;

                    Interface.GetMod().DataFileSystem.WriteObject("PlayTime", playTimeData);
                }
            }
        }

        [ChatCommand("playtime")]
        private void PlayTimeCommand(BasePlayer player, string command, string[] args)
        {
			if (!hasPermission(player, "canUsePlayTime") && args.Length > 0)
			{
				SendReply(player, Prefix + "You don't have permission to use this command.");

				return;
			}

			var queriedPlayer = "";

			if (args.Length == 0)
			{
				queriedPlayer = player.userID.ToString();
			}
			else
			{
				queriedPlayer = args[0];
			}

			long daysPlayed = 0;
			long hoursPlayed = 0;
			long minutesPlayed = 0;
			long secondsPlayed = 0;

			long playerSteamID = 0;

			playerSteamID = FindPlayer(queriedPlayer);

			if (playerSteamID == 0)
			{
				SendReply(player, Prefix + "The player '" + queriedPlayer + "' does not exist in the system.");

				return;
			}

			string playerName = playTimeData.Players[playerSteamID.ToString()].Name;

			secondsPlayed = playTimeData.Players[playerSteamID.ToString()].PlayTime;

			if (secondsPlayed > 60)
			{
				minutesPlayed = secondsPlayed / 60;
				secondsPlayed = secondsPlayed - (minutesPlayed * 60);
			}

			if (minutesPlayed > 60)
			{
				hoursPlayed = minutesPlayed / 60;
				minutesPlayed = minutesPlayed - (hoursPlayed * 60);
			}

			if (hoursPlayed > 24)
			{
				daysPlayed = hoursPlayed / 24;
				hoursPlayed = hoursPlayed - (daysPlayed * 24);
			}

			if (daysPlayed > 0)
			{
				SendReply(player, Prefix + "The player " + playerName + " (" + playerSteamID + ") has played for " + daysPlayed + " days " + hoursPlayed + " hours and " + minutesPlayed + " minutes.");
			}
			else if (hoursPlayed > 0)
			{
				SendReply(player, Prefix + "The player " + playerName + " (" + playerSteamID + ") has played for " + hoursPlayed + " hours and " + minutesPlayed + " minutes.");
			}
			else if (minutesPlayed > 0)
			{
				SendReply(player, Prefix + "The player " + playerName + " (" + playerSteamID + ") has played for " + minutesPlayed + " minutes.");
			}
			else
			{
				SendReply(player, Prefix + "The player " + playerName + " (" + playerSteamID + ") has played for " + secondsPlayed + " seconds.");
			}
		}

		[ChatCommand("lastseen")]
		private void LastSeenCommand(BasePlayer player, string command, string[] args)
		{
			if (!hasPermission(player, "canUseLastSeen"))
			{
				SendReply(player, Prefix + "You don't have permission to use this command.");

				return;
			}

			if (args.Length == 0)
			{
				SendReply(player, Prefix + "Please enter a players name or steam 64 id.");

				return;
			}

			long currentTimestamp = GrabCurrentTimestamp();
			var queriedPlayer = args[0];
			long playerSteamID = 0;
            try { playerSteamID = FindPlayer(queriedPlayer); } catch (KeyNotFoundException e ) { return; }

			if (playerSteamID == 0)
			{
				SendReply(player, Prefix + "The player '" + queriedPlayer + "' does not exist in the system.");

				return;
			}

			string playerName = playTimeData.Players[playerSteamID.ToString()].Name;

			foreach (BasePlayer onlinePlayer in BasePlayer.activePlayerList)
			{
				if (onlinePlayer.userID.ToString() == playerSteamID.ToString())
				{
					SendReply(player, Prefix + "The player " + playerName + " ( " + playerSteamID + ") is online right now!");

					return;
				}
			}

			long lastLogoutTime = playTimeData.Players[playerSteamID.ToString()].LastLogoutTime;
			long lastSeenDays = 0;
			long lastSeenHours = 0;
			long lastSeenMinutes = 0;
			long lastSeenSeconds = currentTimestamp - lastLogoutTime;

			if (lastSeenSeconds > 60)
			{
				lastSeenMinutes = lastSeenSeconds / 60;
				lastSeenSeconds = lastSeenSeconds - (lastSeenMinutes * 60);
			}

			if (lastSeenMinutes > 60)
			{
				lastSeenHours = lastSeenMinutes / 60;
				lastSeenMinutes = lastSeenMinutes - (lastSeenHours * 60);
			}

			if (lastSeenHours > 24)
			{
				lastSeenDays = lastSeenHours / 24;
				lastSeenHours = lastSeenHours - (lastSeenDays * 24);
			}

			if (lastSeenDays > 0)
			{
				SendReply(player, Prefix + "The player " + playerName + " ( " + playerSteamID + ") was last seen " + lastSeenDays + " days " + lastSeenHours + " hours and " + lastSeenMinutes + " minutes ago.");
			}
			else if (lastSeenHours > 0)
			{
				SendReply(player, Prefix + "The player " + playerName + " ( " + playerSteamID + ") was last seen " + lastSeenHours + " hours and " + lastSeenMinutes + " minutes ago.");
			}
			else if (lastSeenMinutes > 0)
			{
				SendReply(player, Prefix + "The player " + playerName + " ( " + playerSteamID + ") was last seen " + lastSeenMinutes + " minutes ago.");
			}
			else
			{
				SendReply(player, Prefix + "The player " + playerName + " ( " + playerSteamID + ") was last seen " + lastSeenSeconds + " seconds ago.");
			}
		}

		[ChatCommand("mostonline")]
		private void MostOnlineCommand(BasePlayer player, string command, string[] args)
		{
			if (!hasPermission(player, "canUseMostOnline"))
			{
				SendReply(player, Prefix + "You don't have permission to use this command.");

				return;
			}

			Dictionary<string, long> mostOnline = new Dictionary<string, long>();

			foreach (string playerID in playTimeData.Players.Keys)
			{
				mostOnline.Add(playTimeData.Players[playerID].Name, playTimeData.Players[playerID].PlayTime);
			}

			List<KeyValuePair<string, long>> sorted = (from kv in mostOnline orderby kv.Value descending select kv).Take(10).ToList();

			string highscore = "<color=red>Top 10 Most Online</color> \n" +
			"------------------------------ \n" +
			"Rank - Online Time (Days:Hours:Minutes) - <color=red>Player Name</color> \n" +
			"------------------------------ \n";
			int count = 0;
			foreach (KeyValuePair<string, long> kv in sorted)
			{
				count++;
				long daysPlayed = 0;
				long hoursPlayed = 0;
				long minutesPlayed = 0;
				long secondsPlayed = kv.Value;

				string daysPlayedString = "";
				string hoursPlayedString = "";
				string minutesPlayedString = "";

				if (secondsPlayed > 60)
				{
					minutesPlayed = secondsPlayed / 60;
					secondsPlayed = secondsPlayed - (minutesPlayed * 60);
				}

				if (minutesPlayed > 60)
				{
					hoursPlayed = minutesPlayed / 60;
					minutesPlayed = minutesPlayed - (hoursPlayed * 60);
				}

				if (hoursPlayed > 24)
				{
					daysPlayed = hoursPlayed / 24;
					hoursPlayed = hoursPlayed - (daysPlayed * 24);
				}

				if (daysPlayed < 10) { daysPlayedString = "0" + daysPlayed.ToString(); } else { daysPlayedString = daysPlayed.ToString(); }
				if (hoursPlayed < 10) { hoursPlayedString = "0" + hoursPlayed.ToString(); } else { hoursPlayedString = hoursPlayed.ToString(); }
				if (minutesPlayed < 10) { minutesPlayedString = "0" + minutesPlayed.ToString(); } else { minutesPlayedString = minutesPlayed.ToString(); }

				if (count < 10)
				{
					highscore += "  ";
				}

				highscore += count + "." + daysPlayedString + ":" + hoursPlayedString + ":" + minutesPlayedString + " - <color=red>" + kv.Key + "</color>\n";
			}

			SendReply(player, Prefix + highscore);
		}

		private long FindPlayer(string queriedPlayer)
        {
            long playerSteamID = 0;

            foreach (string playerID in playTimeData.Players.Keys)
            {
                if (playerID == queriedPlayer)
                {
                    playerSteamID = Convert.ToInt64(playerID);
                }
                else if (playTimeData.Players[playerID].Name.Contains(queriedPlayer))
                {
                    playerSteamID = Convert.ToInt64(playerID);
                }
            }

            return playerSteamID;
        }

        private static long GrabCurrentTimestamp()
        {
            long timestamp = 0;
            long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks;
            ticks /= 10000000;
            timestamp = ticks;

            return timestamp;
        }

        bool hasPermission(BasePlayer player, string perm)
        {
            if (player.net.connection.authLevel > 1)
            {
                return true;
            }

            return permission.UserHasPermission(player.userID.ToString(), perm);
        }
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху