C#:
using ConVar;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Oxide.Plugins {
[Info("ChatToConsole", "Vlad-00003", "1.5.0")]
[Description("Copies the in-game chat data to the players console.")]
/*
* Author info:
* E-mail: Vlad-00003@mail.ru
* Vk: vk.com/vlad_00003
*/
internal class ChatToConsole : RustPlugin {
#region Commands
private void CmdToggle(IPlayer player, string command, string[] args) {
if (player.IsServer) {
player.Message(GetMsg("OnlyPlayer", player.Id));
return;
}
if (!CanUse(player.Id)) {
player.Message(GetMsg("NoPermission", player.Id));
return;
}
if (_listedUsers.Contains(player.Id)) {
_listedUsers.Remove(player.Id);
SaveData();
player.Message(GetMsg(_enabledByDefault ? "On" : "Off", player.Id));
return;
}
player.Message(GetMsg(_enabledByDefault ? "Off" : "On", player.Id));
_listedUsers.Add(player.Id);
SaveData();
}
#endregion
#region Chat Format
private struct ChatFormat {
private readonly Chat.ChatChannel _channel;
private readonly string _formattedMessage;
private readonly string _formattedPrefixes;
private readonly string _formattedUsername;
private readonly BasePlayer _sender;
private ChatFormat(BasePlayer sender, string formattedUsername, string formattedPrefixes, string formattedMessage, Chat.ChatChannel channel) {
_sender = sender;
_formattedUsername = formattedUsername;
_formattedPrefixes = formattedPrefixes;
_formattedMessage = formattedMessage;
_channel = channel;
}
public string ChatLang {
get {
switch (_channel) {
case Chat.ChatChannel.Global : case Chat.ChatChannel.Team : case Chat.ChatChannel.Server : return _channel.ToString("F");
default : return "Chat";
}
}
}
private static string GetFormattedText(string text, string color = "#fff") {
return Formatter.ToUnity($"<color={color}>{text}</color>");
}
public static ChatFormat FromBroadcast(string message, string username, string color) {
username = username.EscapeRichText();
message = message.EscapeRichText();
return new ChatFormat(null, GetFormattedText(username, color), string.Empty, GetFormattedText(message), Chat.ChatChannel.Server);
}
public static ChatFormat FromRust(BasePlayer player, string message, Chat.ChatChannel channel) {
var color = "#5af";
if (player.IsAdmin && !_hideAdmins) color = "#af5";
if (player.IsDeveloper || DeveloperList.Contains(player.UserIDString)) color = "#fa5";
var formattedName = GetFormattedText(player.displayName.EscapeRichText(), color);
var formattedMessage = GetFormattedText(message ?? string.Empty);
return new ChatFormat(player, formattedName, string.Empty, formattedMessage, channel);
}
public static ChatFormat FromBetterChat(Dictionary<string, object> data) {
var player = (IPlayer)data["Player"];
var message = data["Message"] as string;
var messageColor = ((Dictionary<string, object>)data["MessageSettings"])["Color"] as string;
var usernameColor = ((Dictionary<string, object>)data["UsernameSettings"])["Color"] as string;
var prefixes = string.Join(" ", (List<string>)data["Titles"]);
var channel = (Chat.ChatChannel)data["ChatChannel"];
return new ChatFormat(player.Object as BasePlayer, GetFormattedText(player.Name.EscapeRichText(), usernameColor), GetFormattedText(prefixes), GetFormattedText(message, messageColor), channel);
}
public static ChatFormat FromChatPlus(Dictionary<string, object> data) {
var player = (IPlayer)data["Player"];
var username = GetFormattedText(player.Name.EscapeRichText());
var message = data["Message"] as string;
var prefixes = data["Prefixes"] as string;
return new ChatFormat(player.Object as BasePlayer, username, Formatter.ToUnity(prefixes), Formatter.ToUnity(message), Chat.ChatChannel.Global);
}
public bool ShouldSee(BasePlayer player) {
//ulong playerid = 3651584;
switch (_channel) {
case Chat.ChatChannel.Global : if (ConVar.Server.globalchat) return true;
if (!_sender) return false;
return (player.transform.position - _sender.transform.position).sqrMagnitude <= 2500;
case Chat.ChatChannel.Team : if (!_sender) return false;
var team = RelationshipManager.Instance.FindPlayersTeam(_sender.userID);
return team != null && team.members.Contains(player.userID);
case Chat.ChatChannel.Server : return true;
default : return true;
}
}
public string GetFormatted(string format) {
return format.Replace("{Time}", DateTime.UtcNow.Add(_timeZone).ToShortTimeString()).Replace("{Titles}", _formattedPrefixes).Replace("{Name}", _formattedUsername).Replace("{SteamID}", _sender?.UserIDString ?? "0").Replace("{Message}", _formattedMessage);
}
}
#endregion
#region Vars
private string _permission = "ChatToConsole.See";
private string _permissionAdmin = "ChatToConsole.Admin";
private static string _command = "/ctc";
private static string _format = "{Time}: [{ChatLang}] {Titles}{Name}({SteamID}): {Message}";
private static string _pmFormat = "{Time}: [{PM}] {From}->{To}: {Message}";
private static string _broadcastFormat = "{Time}: [{ChatLang}] {Message}";
private static bool _enabledByDefault = true;
private static bool _hideAdmins = false;
private static bool _removeAAA = false;
private static TimeSpan _timeZone = DateTimeOffset.Now.Offset;
[PluginReference]
private Plugin ChatPlus, BetterChat;
#endregion
#region Data
private List<string> _listedUsers;
private void LoadData() {
try {
_listedUsers = Interface.Oxide.DataFileSystem.ReadObject<List<string>>(Title);
}
catch (Exception e) {
PrintError($"Failed to load active admins data file (is the file corrupt?) ({e.Message})");
_listedUsers = new List<string>();
}
}
private void SaveData() {
Interface.Oxide.DataFileSystem.WriteObject(Title, _listedUsers);
}
#endregion
#region Config and data initalization
protected override void LoadDefaultConfig() {
PrintWarning("Creating new config file...");
}
protected override void LoadConfig() {
base.LoadConfig();
string timeZone = _timeZone.ToString("hh\\:mm");
var changed = GetConfig("Permission to use command and get the chat to console", ref _permission) | GetConfig("Permission to see all team's chat and all PM", ref _permissionAdmin) | GetConfig("Chat command to toggle printing chat to console", ref _command) | GetConfig("Messages format", ref _format) | GetConfig("Private messages format", ref _pmFormat) | GetConfig("Broadcast format", ref _broadcastFormat) | GetConfig("Chat to console enabled by default", ref _enabledByDefault) | GetConfig("Hide admin color", ref _hideAdmins) | GetConfig("Hide give commands", ref _removeAAA) | GetConfig("Time zone shift (hh:mm)", ref timeZone);
if (!TimeSpan.TryParseExact(timeZone, "hh\\:mm", null, out _timeZone)) {
PrintError("Can't parse {0} to TimeSpan! UTC time would be used instead, check your config...", timeZone);
_timeZone = TimeSpan.Zero;
}
if (changed) {
PrintWarning("Config file was updated");
SaveConfig();
}
permission.RegisterPermission(_permission, this);
permission.RegisterPermission(_permissionAdmin, this);
LoadData();
}
private void Init() {
AddCovalenceCommand(_command.Replace("/", string.Empty), "CmdToggle", _permission);
}
#endregion
#region localization
private string GetMsg(string key) {
return lang.GetMessage(key, this);
}
private string GetMsg(string key, string playerId) {
return lang.GetMessage(key, this, playerId);
}
protected override void LoadDefaultMessages() {
lang.RegisterMessages(new Dictionary<string, string> {
["OnlyPlayer"]
= "This command can only be executed from the game client!", ["Off"] = "Chat would no longer be displayed in your console.", ["On"] = "You would receive all chat messages to your console.", ["NoPermission"] = "You don't have the permission to use this command.", ["Chat"] = "Chat", ["Global"] = "Global", ["Team"] = "Team", ["Server"] = "Server", ["WrongDict"] = "{0} dictionary has wrong format.Please, contact the developer - https://vk.com/vlad_00003", ["PM"] = "PM"
}
, this);
lang.RegisterMessages(new Dictionary<string, string> {
["OnlyPlayer"]
= "Эту команду можно использовать только в игре!", ["Off"] = "Чат более не будет отображаться в вашей консоли.", ["On"] = "Все сообщения из чата теперь будут дублироваться в вашу консоль.", ["NoPermission"] = "Недостаточно прав на выполнение команды.", ["Chat"] = "Чат", ["Global"] = "Общий", ["Team"] = "Команда", ["Server"] = "Сервер", ["WrongDict"] = "Плагин {0} передал неверный словарь.Пожалуйста, свяжитесь с разработчиком - https://vk.com/vlad_00003", ["PM"] = "ЛС"
}
, this, "ru");
}
#endregion
#region Hooks
private void OnPlayerChat(BasePlayer sender, string message, Chat.ChatChannel channel) {
if (BetterChat || ChatPlus) return;
if (sender == null) return;
SendChatToConsole(ChatFormat.FromRust(sender, message, channel), _format);
}
private void OnBetterChat(Dictionary<string, object> data) {
try {
SendChatToConsole(ChatFormat.FromBetterChat(data), _format);
}
catch (Exception) {
PrintError(GetMsg("WrongDict"), "BetterChat");
}
}
private void OnChatPlusMessage(Dictionary<string, object> data) {
try {
SendChatToConsole(ChatFormat.FromChatPlus(data), _format);
}
catch (Exception) {
PrintError(GetMsg("WrongDict"), "ChatPlus");
}
}
private void OnServerMessage(string message, string username, string color, ulong userid) {
if (_removeAAA && message.Contains("gave") && username == "SERVER") return;
SendChatToConsole(ChatFormat.FromBroadcast(message, username, color), _broadcastFormat);
}
[HookMethod("OnPMProcessed")]
private void OnPrivateMessage(IPlayer sender, IPlayer receiver, string message) {
var formatted = _pmFormat.Replace("{Time}", DateTime.Now.ToShortTimeString()).Replace("{From}", sender.Name).Replace("{To}", receiver.Name).Replace("{Message}", message);
SendPmToConsole(formatted, sender.Id, receiver.Id);
}
#endregion
#region Helpers
private void SendChatToConsole(ChatFormat message, string format) {
var formatted = message.GetFormatted(format);
foreach (var player in BasePlayer.activePlayerList) {
if (!CheckEnabled(player.UserIDString)) continue;
if (!CanAdmin(player.UserIDString) && !message.ShouldSee(player)) continue;
var msg = formatted.Replace("{ChatLang}", GetMsg(message.ChatLang, player.UserIDString));
player.ConsoleMessage(msg);
}
}
private void SendPmToConsole(string message, params string[] participants) {
foreach (var player in BasePlayer.activePlayerList) {
if (!CheckEnabled(player.UserIDString)) continue;
if (!CanAdmin(player.UserIDString) && !participants.Contains(player.UserIDString)) continue;
var msg = message.Replace("{PM}", GetMsg("PM", player.UserIDString));
player.ConsoleMessage(msg);
}
}
private bool CheckEnabled(string id) {
if (!CanUse(id)) return false;
var contains = _listedUsers.Contains(id);
return _enabledByDefault ? !contains : contains;
}
private bool CanUse(string id) {
return permission.UserHasPermission(id, _permission) || CanAdmin(id);
}
private bool CanAdmin(string id) {
return permission.UserHasPermission(id, _permissionAdmin);
}
private bool GetConfig<T>(string key, ref T var) {
if (Config[key] != null) {
var = (T)Convert.ChangeType(Config[key], typeof(T));
return false;
}
Config[key] = var;
return true;
}
#endregion
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////