C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using ConVar;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using UnityEngine;
namespace Oxide.Plugins {
[Info("Chat To Console", "Purples", "1.1.1")]
// Works with: BetterChat
[Description("Copies the in-game chat to the console.")]
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 class 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 => _channel.HasValue ? _channel.Value.ToString("F") : "Chat";
private static string GetFormattedText(string text, string color = "#fff") {
return Formatter.ToUnity($"<color={color}>{text}</color>");
}
public static ChatFormat FromRust(BasePlayer player, string message, Chat.ChatChannel channel) {
var color = "#5af";
if (player.IsAdmin) color = "#af5";
if (player.IsDeveloper || DeveloperList.Contains(player.UserIDString)) color = "#fa5";
var formattedName = GetFormattedText(player.displayName.EscapeRichText(), color);
var formattedMessage = GetFormattedText(message ?? "");
return new ChatFormat(player, formattedName, "", 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"];
var formattedName = GetFormattedText(player.Name.EscapeRichText(), usernameColor);
var formattedPrefix = GetFormattedText(prefixes);
var formattedMessage = GetFormattedText(message, messageColor);
return new ChatFormat(player.Object as BasePlayer, formattedName, formattedPrefix, formattedMessage, 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), null);
}
public bool ShouldSee(ulong playerid = 3182592) {
if (_channel != Chat.ChatChannel.Team) return true;
var team = _sender.Team;
if (team == null || team.members.Count == 0) return true;
return team.members.Contains(playerid);
}
public string GetFormatted() {
return _format.Replace("{Time}", DateTime.Now.ToShortTimeString()).Replace("{Titles}", _formattedPrefixes).Replace("{Name}", _formattedUsername).Replace("{SteamID}", _sender.UserIDString).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 bool _enabledByDefault = true;
[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();
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("Chat to console enabled by default", ref _enabledByDefault);
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/arsgo", ["PM"] = "PM"
}
, this);
lang.RegisterMessages(new Dictionary<string, string> {
["OnlyPlayer"]
= "Эту команду можно использовать только в игре!", ["Off"] = "Чат более не будет отображаться в вашей консоли.", ["On"] = "Все сообщения из чата теперь будут дублироваться в вашу консоль.", ["NoPermission"] = "Недостаточно прав на выполнение команды.", ["Chat"] = "Чат", ["Global"] = "Общий", ["Team"] = "Команда", ["Server"] = "Сервер", ["WrongDict"] = "Плагин {0} передал неверный словарь.Пожалуйста, свяжитесь с разработчиком - https://vk.com/arsgo", ["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));
}
private void OnBetterChat(Dictionary<string, object> data) {
try {
SendChatToConsole(ChatFormat.FromBetterChat(data));
}
catch (Exception) {
PrintError(GetMsg("WrongDict"), "BetterChat");
}
}
private void OnChatPlusMessage(Dictionary<string, object> data) {
try {
SendChatToConsole(ChatFormat.FromChatPlus(data));
}
catch (Exception) {
PrintError(GetMsg("WrongDict"), "ChatPlus");
}
}
[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) {
var formatted = message.GetFormatted();
foreach (var player in BasePlayer.activePlayerList) {
if (!CheckEnabled(player.UserIDString)) continue;
if (!CanAdmin(player.UserIDString) && !message.ShouldSee(player.userID)) 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
}
}