Спам в мессенжере (#3835)

This commit is contained in:
Vigers Ray 2026-02-01 05:01:38 +01:00 committed by GitHub
parent b061326f14
commit bf135fe706
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 788 additions and 2 deletions

View file

@ -401,4 +401,79 @@ public sealed partial class MessengerServerSystem
}
}
}
/// <summary>
/// Sends a fake message to a specific user (used for spam).
/// </summary>
public void SendFakePersonalMessage(EntityUid uid, string recipientId, string senderId, string senderName, string content)
{
if (!TryComp<MessengerServerComponent>(uid, out var component))
return;
if (!component.Users.ContainsKey(recipientId))
return;
var timestamp = GetStationTime();
var messageId = GetNextMessageId(uid, component);
var message = new MessengerMessage(senderId, senderName, content, timestamp, null, recipientId, isRead: false, messageId);
var chatId = GetPersonalChatId(senderId, recipientId);
if (!component.MessageHistory.TryGetValue(chatId, out var history))
{
history = new List<MessengerMessage>();
component.MessageHistory[chatId] = history;
}
history.Add(message);
TrimMessageHistory(history, component.MaxMessageHistory);
var isChatOpen = component.OpenChats.TryGetValue(recipientId, out var openChatId) && openChatId == chatId;
if (isChatOpen)
{
message.IsRead = true;
}
else
{
if (!component.UnreadCounts.TryGetValue(recipientId, out var recipientUnreads))
{
recipientUnreads = new Dictionary<string, int>();
component.UnreadCounts[recipientId] = recipientUnreads;
}
recipientUnreads.TryGetValue(chatId, out var currentCount);
recipientUnreads[chatId] = currentCount + 1;
}
if (!TryComp<DeviceNetworkComponent>(uid, out var serverDevice))
return;
uint? pdaFrequency = null;
if (_prototypeManager.TryIndex(component.PdaFrequencyId, out var pdaFreq))
{
pdaFrequency = pdaFreq.Frequency;
}
var payload = new NetworkPayload
{
[DeviceNetworkConstants.Command] = MessengerCommands.CmdMessageReceived,
["sender_id"] = message.SenderId,
["sender_name"] = message.SenderName,
["content"] = message.Content,
["timestamp"] = message.Timestamp.TotalSeconds,
["group_id"] = message.GroupId ?? string.Empty,
["recipient_id"] = message.RecipientId ?? string.Empty,
["is_read"] = message.IsRead,
["message_id"] = message.MessageId,
["sender_job_icon_id"] = string.Empty,
["image_path"] = string.Empty
};
if (pdaFrequency.HasValue)
{
_deviceNetwork.QueuePacket(uid, recipientId, payload, frequency: pdaFrequency, network: serverDevice.DeviceNetId);
}
else
{
_deviceNetwork.QueuePacket(uid, recipientId, payload);
}
}
}

View file

@ -0,0 +1,181 @@
using System.Linq;
using Content.Shared._Sunrise.Messenger;
using Content.Shared._Sunrise.SunriseCCVars;
using Content.Shared.Dataset;
using Robust.Shared.Configuration;
using Robust.Shared.Random;
using Robust.Shared.Timing;
namespace Content.Server._Sunrise.Messenger;
public sealed partial class MessengerServerSystem
{
[Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly IGameTiming _timing = default!;
private bool _spamEnabled;
private float _spamMinTime;
private float _spamMaxTime;
private float _spamPlayerPercentage;
private TimeSpan _nextTick = TimeSpan.Zero;
private readonly TimeSpan _refreshCooldown = TimeSpan.FromSeconds(1);
private void InitializeSpam()
{
Subs.CVar(_cfg, SunriseCCVars.MessengerSpamEnabled, OnSpamEnabledChanged, true);
Subs.CVar(_cfg, SunriseCCVars.MessengerSpamMinTime, OnSpamMinTimeChanged, true);
Subs.CVar(_cfg, SunriseCCVars.MessengerSpamMaxTime, OnSpamMaxTimeChanged, true);
Subs.CVar(_cfg, SunriseCCVars.MessengerSpamPlayerPercentage, OnSpamPlayerPercentageChanged, true);
}
private void OnSpamEnabledChanged(bool value)
{
_spamEnabled = value;
}
private void OnSpamMinTimeChanged(float value)
{
UpdateSpamTiming(value, _spamMaxTime);
}
private void OnSpamMaxTimeChanged(float value)
{
UpdateSpamTiming(_spamMinTime, value);
}
private void OnSpamPlayerPercentageChanged(float value)
{
_spamPlayerPercentage = value;
}
private void UpdateSpamTiming(float min, float max)
{
_spamMinTime = min;
_spamMaxTime = max;
if (_spamMinTime > _spamMaxTime)
{
(_spamMinTime, _spamMaxTime) = (_spamMaxTime, _spamMinTime);
}
}
private void ResetSpamTimer(StationMessengerSpamComponent component)
{
component.Timer = 0;
component.NextSpamTime = _random.NextFloat(_spamMinTime, _spamMaxTime);
}
private void UpdateSpam(float frameTime)
{
if (_nextTick > _timing.CurTime)
return;
_nextTick = _timing.CurTime + _refreshCooldown;
if (!_spamEnabled)
return;
var query = EntityQueryEnumerator<StationMessengerSpamComponent>();
while (query.MoveNext(out var uid, out var spam))
{
if (spam.NextSpamTime <= 0)
{
ResetSpamTimer(spam);
continue;
}
spam.Timer += (float)_refreshCooldown.TotalSeconds;
if (spam.Timer < spam.NextSpamTime)
continue;
ResetSpamTimer(spam);
var serverResult = GetServerEntity(uid);
if (serverResult != null)
{
Sawmill.Info($"Triggering spam wave for station {uid} (Server: {serverResult.Value.Item1})");
SendSpamWave(serverResult.Value.Item1, serverResult.Value.Item2);
}
else
{
Sawmill.Warning($"Could not find messenger server for station {uid}, skipping spam wave.");
}
}
}
private void SendSpamWave(EntityUid uid, MessengerServerComponent component)
{
var prototypes = _prototypeManager.EnumeratePrototypes<MessengerSpamPrototype>().ToList();
if (prototypes.Count == 0)
return;
var players = new List<(EntityUid Uid, MessengerServerComponent Component, MessengerUser User)>();
foreach (var user in component.Users.Values)
{
// Skip spam bots
if (user.UserId.StartsWith("spam_"))
continue;
players.Add((uid, component, user));
}
if (players.Count == 0)
{
return;
}
var targetCount = (int)(players.Count * _spamPlayerPercentage);
if (targetCount < 1)
targetCount = 1;
_random.Shuffle(players);
var count = Math.Min(targetCount, players.Count);
Sawmill.Info($"Sending spam to {count} users (Total: {players.Count}, Target %: {_spamPlayerPercentage})");
for (int i = 0; i < count; i++)
{
var p = players[i];
SendSpamToUser(p.Uid, p.Component, p.User, prototypes);
}
}
private void SendSpamToUser(EntityUid uid, MessengerServerComponent component, MessengerUser user, List<MessengerSpamPrototype> prototypes)
{
var proto = _random.Pick(prototypes);
var senderName = GetRandomString(proto.SenderDataset);
if (proto.NameDataset != null && proto.SurnameDataset != null)
{
senderName += " " + GetRandomString(proto.NameDataset);
senderName += " " + GetRandomString(proto.SurnameDataset);
}
var messageContent = GetRandomString(proto.MessageDataset);
if (string.IsNullOrWhiteSpace(messageContent))
return;
var senderId = $"spam_{Math.Abs(senderName.GetHashCode())}";
if (!component.Users.ContainsKey(senderId))
{
var spamUser = new MessengerUser(senderId, senderName);
component.Users.Add(senderId, spamUser);
}
SendFakePersonalMessage(uid, user.UserId, senderId, senderName, messageContent);
}
private string GetRandomString(string datasetId)
{
if (!_prototypeManager.TryIndex(datasetId, out LocalizedDatasetPrototype? dataset))
return "Error";
var key = _random.Pick(dataset.Values);
return _loc.GetString(key);
}
}

View file

@ -11,6 +11,7 @@ using Content.Shared.Inventory;
using Robust.Shared.Prototypes;
using Content.Server.CartridgeLoader;
using Content.Server.DeviceNetwork.Components;
using Robust.Shared.Random;
namespace Content.Server._Sunrise.Messenger;
@ -27,7 +28,7 @@ public sealed partial class MessengerServerSystem : EntitySystem
[Dependency] private readonly ILocalizationManager _loc = default!;
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!;
[Dependency] private readonly IRobustRandom _random = default!;
private ISawmill Sawmill { get; set; } = default!;
/// <summary>
@ -55,6 +56,14 @@ public sealed partial class MessengerServerSystem : EntitySystem
SubscribeLocalEvent<MessengerServerComponent, DeviceNetServerDisconnectedEvent>(OnServerDisconnected);
SubscribeLocalEvent<MessengerServerComponent, RoundRestartCleanupEvent>(OnRoundRestart);
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnPlayerSpawnComplete);
InitializeSpam();
}
public override void Update(float frameTime)
{
base.Update(frameTime);
UpdateSpam(frameTime);
}
private void OnRoundRestart(EntityUid uid, MessengerServerComponent component, RoundRestartCleanupEvent args)

View file

@ -0,0 +1,20 @@
namespace Content.Server._Sunrise.Messenger;
/// <summary>
/// Component for handling messenger spam timing on a station/entity.
/// </summary>
[RegisterComponent]
public sealed partial class StationMessengerSpamComponent : Component
{
/// <summary>
/// Current timer in seconds.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float Timer;
/// <summary>
/// Target time in seconds for the next spam wave.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float NextSpamTime;
}

View file

@ -0,0 +1,22 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._Sunrise.Messenger;
[Prototype]
public sealed partial class MessengerSpamPrototype : IPrototype
{
[IdDataField]
public string ID { get; private set; } = default!;
[DataField(required: true)]
public string SenderDataset { get; private set; } = string.Empty;
[DataField(required: true)]
public string MessageDataset { get; private set; } = string.Empty;
[DataField]
public string? NameDataset { get; private set; }
[DataField]
public string? SurnameDataset { get; private set; }
}

View file

@ -590,4 +590,33 @@ public sealed partial class SunriseCCVars : CVars
/// </summary>
public static readonly CVarDef<string> MessengerFavoriteEmojis =
CVarDef.Create("messenger.favorite_emojis", "", CVar.ARCHIVE | CVar.CLIENTONLY);
/*
* Messenger Spam
*/
/// <summary>
/// Enables the mechanic where players receive spam messages on their PDA.
/// </summary>
public static readonly CVarDef<bool> MessengerSpamEnabled =
CVarDef.Create("messenger.spam_enabled", true, CVar.SERVERONLY);
/// <summary>
/// Minimum time between spam waves in seconds.
/// </summary>
public static readonly CVarDef<float> MessengerSpamMinTime =
CVarDef.Create("messenger.spam_min_time", 300f, CVar.SERVERONLY);
/// <summary>
/// Maximum time between spam waves in seconds.
/// </summary>
public static readonly CVarDef<float> MessengerSpamMaxTime =
CVarDef.Create("messenger.spam_max_time", 600f, CVar.SERVERONLY);
/// <summary>
/// Percentage of players (0.0 to 1.0) who will receive spam during a wave.
/// </summary>
public static readonly CVarDef<float> MessengerSpamPlayerPercentage =
CVarDef.Create("messenger.spam_player_percentage", 0.4f, CVar.SERVERONLY);
}

View file

@ -0,0 +1,208 @@
# Casino
messenger-spam-casino-sender-1 = МегаСтавка — ставь или проиграешь!
messenger-spam-casino-sender-2 = Онлайн казино МегаСтавка — 256 лет на рынке полулегальных азартных игр
messenger-spam-casino-sender-3 = Сэкси дилеры в лучшем онлайн казино
messenger-spam-casino-sender-4 = Все остальные онлайн казино — кидалы. Мы не такие.
messenger-spam-casino-message-1 = Думаете жать одну кнопку на автомате это занятие для умственно неполноценных? Докажите что это не так сыграв у нас!
messenger-spam-casino-message-2 = В нашем казино нет никаких «подкруток» или прочих нечестных приёмов. Вам просто не везёт!
messenger-spam-casino-message-3 = Проиграли всю зарплату в друго казино? Проиграйте ещё одну у нас! В этот раз точно повезёт!
messenger-spam-casino-message-4 = Зачем работать на корпорации, когда можно спустить свою жизнь чуть более приятным способом?
messenger-spam-casino-message-5 = Игровая зависимость этом миф! Они просто не могут оторваться от 450 увлекательных игр в нашем казино!
messenger-spam-casino-message-6 = Отделения МегаСтавки есть везде — от Элизиума до Аурума! Да, может даже на вашей станции!
messenger-spam-casino-message-7 = В Онлайн Казино МегаСтавка мы не чешем колоду, гарантируем честную раздачу и наши колоды заряжены не в киосках как у конкурентов!
# Dating
messenger-spam-dating-sender-1 = СладкаяЦыпа
messenger-spam-dating-sender-2 = Одинокая русская невеста
messenger-spam-dating-sender-3 = ТаярскаяКрасотка57
messenger-spam-dating-sender-4 = СкРеЛлОчКа))0
messenger-spam-dating-sender-5 = Унаточка_чмаффки
messenger-spam-dating-sender-6 = Фанатка_ЕРП_82
messenger-spam-dating-sender-7 = Босс_Качалки93
messenger-spam-dating-message-1 = Классные фотки на БыстрыхСвиданиях! Я бы пообщалась побольше, но у меня кончаются кредиты… если ты мне не скинешь немного XD (БыстрыеСвидания).
messenger-spam-dating-message-2 = Подпишись на мой профиль — мой аккаунт [gender-female]@[gender-female].[pick("ru","ck","tj","ur","nt")], и получишь доступ к моим фото~
messenger-spam-dating-message-3 = Слушай, у меня мало времени. Ты хочешь большой и чистой любви? Если хочешь, то ответь. Ещё никто не ответил…
messenger-spam-dating-message-4 = У вас (1) новое сообщение от Куколки с 4 размером!
messenger-spam-dating-message-5 = Я просто ОБОЖАЮ людей! Такие властные, сильные и умные… ммф… встретимся?
messenger-spam-dating-message-6 = Я просто БЕЗ УМА от вульпакин! Хочу пошевелить с тобой хвостиками! Скинь аудио как ты воешь!
messenger-spam-dating-message-7 = Я, как это говорится у меня на родине, «перфоманс артист».
messenger-spam-dating-message-8 = Мой отец учил меня не стесняться, поэтому… не хочешь вступить в наш клуб? Всего 250 кредитов…
messenger-spam-dating-message-9 = Я просто ВЛЮБЛЕНА в таких скреллов как ты! Такие большие, упругие и сочные щупальца на голове!
messenger-spam-dating-message-10 = Я просто СХОЖУ С УМА от греев! Скинешь фотку своих больших глаз?
messenger-spam-dating-message-11 = Плазмамен? А там внизу так же горячо?~
messenger-spam-dating-message-12 = Все таяры такие милые? Обещаю почесать за ушком когда мы встретимся <3
messenger-spam-dating-message-13 = Говорят что КПБ не устают в постели… это правда? Если так, то это свидание!
messenger-spam-dating-message-14 = У Кидан такие большие глаза… скажем так, им есть на что посмотреть…
messenger-spam-dating-message-15 = Легендарная гибкость и влажность слаймоменов… Хочу опробовать на себе!
messenger-spam-dating-message-16 = Всегда хотелось пригреть драска… кстати, ты сегодня мальчик или девочка?
messenger-spam-dating-message-17 = Надеюсь что диона переживёт отсутствие света под одеялом?~
messenger-spam-dating-message-18 = Все остальные такие неженки… а вот воксы — самое то. Особенно пираты, ух… Встретимся?
messenger-spam-dating-message-19 = У вас (2) новых просмотров профиля: Секси Скреллка и Сосед-по-Качалке
# Finance
messenger-spam-finance-sender-1 = Ассоциация Галактических Платежей
messenger-spam-finance-sender-2 = Бюро Отличного Бизнеса
messenger-spam-finance-sender-3 = Надёжные Электронные Платежи
messenger-spam-finance-sender-4 = Финансовый Департамент NanoTransen
messenger-spam-finance-sender-5 = Главное Казначейство
messenger-spam-finance-message-1 = Роскошные часы по бросовым ценам! Есть экземпляры с древнего Альтама!
messenger-spam-finance-message-2 = Часы, Ювелирные Изделия и Аксессуары из костей, Сумки и Кошельки из кожи
messenger-spam-finance-message-3 = Внесите на счёт $100 и мгновенно получите назад $300! «Реально работает!» — Бобби
messenger-spam-finance-message-4 = Кредиты для граждан ТСФ! Всего лишь от 99% годовых! Для остальных — 100%!
messenger-spam-finance-message-5 = К нам поступила жалоба от одного из Ваших коллег по поводу его отношениий с Вами. После разбирательств вы были объявлены в розыск за домогательства. Я могу убедить его отозвать заявление за символические 5000 кредитов.
messenger-spam-finance-message-6 = Мы убедительно просим Вас открыть ОТЧЕТ О ЖАЛОБЕ (прилагается), чтобы ответить на поступившую на вас жалобу, иначе вам будет начислен штраф.
# Medicine
messenger-spam-medicine-sender-1 = На часах полшестого?
messenger-spam-medicine-sender-2 = Имеете проблемы с дисфункцией?
messenger-spam-medicine-sender-3 = Слишком часто «болит голова»?
messenger-spam-medicine-message-1 = Доктор Максман: РЕАЛЬНЫЕ доктора, РЕАЛЬНАЯ наука, РЕАЛЬНЫЕ результаты! Уникальная мазь на основе дегидроза фуфломицина!
messenger-spam-medicine-message-2 = Доктор Максман был создан Джорджем Окуляром, сертифицированным ЦК урологом который лишь в этом секторе помог больше 70 000 пациентов с «мужскими проблемами». Может даже вашему начальнику!
messenger-spam-medicine-message-3 = После семи лет исследований доктор Окуляр и его команда разработали эту простую и революционную формулу улучшения для мужчин. Редкий фуфломицин удалось синтезировать патентованым способом с помощью дегидроза монооксида дигидрогена!
messenger-spam-medicine-message-4 = Мужчины всех видов сообщают об УДИВИТЕЛЬНОМ увеличении длины, ширины и выносливости.
# Prince
messenger-spam-prince-sender-1 = Др.
messenger-spam-prince-sender-2 = Наследный принц
messenger-spam-prince-sender-3 = Король-регент
messenger-spam-prince-sender-4 = Профессор
messenger-spam-prince-sender-5 = Капитан
messenger-spam-prince-name-1 = Роберт
messenger-spam-prince-name-2 = Альфред
messenger-spam-prince-name-3 = Джозефат
messenger-spam-prince-name-4 = Кингсли
messenger-spam-prince-name-5 = Сехи
messenger-spam-prince-name-6 = Жуан
messenger-spam-prince-surname-1 = Мугавэ
messenger-spam-prince-surname-2 = Нкем
messenger-spam-prince-surname-3 = Гвембеш
messenger-spam-prince-surname-4 = Абимбола
messenger-spam-prince-surname-5 = Ндим
messenger-spam-prince-surname-6 = Эну
messenger-spam-prince-message-1 = ВАШИ СРЕДСТВА БЫЛИ ПЕРЕВЕДЕНЫ В БАНК РАЗВИТИЯ. ДЛЯ ДАЛЬНЕЙШЕГО ПЕРЕВОДА ДЕНЕЖНЫХ СРЕДСТВ СООБЩИТЕ СВОЙ НОМЕР АККАУНТА И ПИН-КОД.
messenger-spam-prince-message-2 = Мы рады сообщить вам, что в связи с задержкой нам было поручено НЕМЕДЛЕННО перевести все средства на ваш счет. Для подтверждения счёта переведите 1000 кредитов. Не стоит волноваться, мы вернём вам кредиты после проверки.
messenger-spam-prince-message-3 = Уважаемый получатель средств, сообщаем Вам, что перевод наследства окончательно одобрен и деньги готовы для получения Вами. Всё что Вам нужно сделать — отправить на этот же номер столько кредитов сколько Вы сможете. Это простая банковская формальность. В качестве благодарности мы вышлем Вам в 10 раз больше кредитов.
messenger-spam-prince-message-4 = Из-за отсутствия у меня доверенных лиц мне требуется финансовый счет за пределами моего мира чтобы немедленно внести сумму в размере ПЯТИ МИЛЛИОНОВ кредитов.
messenger-spam-prince-message-5 = Приветствую вас, сэр или мэм. Я с огромным сожалением сообщаю вам, что я умираю, и, из-за отсутствия наследников я выбрал вас, чтобы вы получили все мои сбережения за всю мою жизнь в размере 1,5 миллиарда кредитов. Но у меня нет вашего номера аккаунта и пин-кода, пожалуйста, сообщите их пока не поздно.
# Adult
messenger-spam-adult-sender-1 = Подразделение Морального Духа NanoTransen
messenger-spam-adult-sender-2 = Вы одиноки?
messenger-spam-adult-sender-3 = Дон Солевая
messenger-spam-adult-sender-4 = www.wetskrell.nt
messenger-spam-adult-message-1 = Подразделение Морального Духа NanoTransen предоставляет вам качественные развлекательные сайты. www.wetskrell.nt — один из таких сайтов и, специально для вас, ЦК сделало его бесплатным! Осталось только перейти по ссылке!
messenger-spam-adult-message-2 = WetSkrell.nt является ксенофильским веб-сайтом, одобренным NT для использования членами экипажа мужского пола среди множества станций и аванпостов.
messenger-spam-adult-message-3 = Wetskrell.nt обеспечивает высочайшее качество мужских развлечений для сотрудников Nanotrasen. Почти все модели старше 18 лет!
messenger-spam-adult-message-4 = Просто введите номер и пин-код своего банковского аккаунта Nanotrasen. После этого вы получите безлимитный доступ ко ВСЕМУ контенту www.wetskrell.nt!
# Lottery
messenger-spam-lottery-sender-1 = Вы выиграли бесплатные билеты!
messenger-spam-lottery-sender-2 = Нажмите здесь, чтобы получить свой приз!
messenger-spam-lottery-sender-3 = Вы 1000-й посетитель!
messenger-spam-lottery-sender-4 = Вы - счастливый обладатель главного приза!
messenger-spam-lottery-message-1 = Вы выиграли билеты на новейший боевик БИТВА ЗА СТАНЦИЮ
messenger-spam-lottery-message-2 = Вы выиграли билеты на новейшую криминальную драму ПО СЛЕДАМ МАРТЫШЕК
messenger-spam-lottery-message-3 = Вы выиграли билеты на новейшую романтическую комедию БОЛЬШАЯ РАЗБОРКА В МАЛЕНЬКОЙ КРОВАТИ
messenger-spam-lottery-message-4 = Вы выиграли билеты на скандальный блокбастер ПОЛНЫЙ ДОСТУП
messenger-spam-lottery-message-5 = Вы выиграли билеты на скандальную комедию КАПИТАН МЁРТВ!
messenger-spam-lottery-message-6 = Вы выиграли билеты на фильм ужасов УДАР СПЯЩЕГО КАРПА
messenger-spam-lottery-message-7 = Вы выиграли билеты на слэшер ТУННЕЛЬНЫЙ СНЕГОВИК
messenger-spam-lottery-message-8 = Вы выиграли билеты на трагикомедию БУДНИ ОХРАНЫ
messenger-spam-lottery-message-9 = Вы выиграли билеты на %УДАЛЕНО АВТОМАТИЧЕСКИМ ФИЛЬТРОМ. СЛАВА NANOTRASEN%
messenger-spam-lottery-message-10 = Вы выиграли билеты на короткометражный фильм ВСЕ КОНТРАКТЫ РАСТОРГНУТЫ
messenger-spam-lottery-message-11 = Вы выиграли билеты на романтическую комедию ПЕРВЫЙ ХОНК!
messenger-spam-lottery-message-12 = Вы выиграли билеты на приключенческий фильм ВОЛШЕБНИКИ ИЗ ДАЛЁКОГО КОСМОСА
messenger-spam-lottery-message-13 = Вы выиграли билеты на фэнтези ПОСЛЕДНИЙ СЫН ХОНКОМАТЕРИ
messenger-spam-lottery-message-14 = Вы выиграли билеты на боевик МЕСТЬ СИНДИКАТА, ЭПИЗОД III!
messenger-spam-lottery-message-15 = Вы выиграли билеты на документальный фильм СЛАВА НТ
messenger-spam-lottery-message-16 = Вы выиграли билеты на эротический фильм МОХНАТАЯ ПОДРУГА
messenger-spam-lottery-message-17 = Вы выиграли билеты на эротический фильм КЛУБ КОЖЕВЕННОГО МАСТЕРСТВА
messenger-spam-lottery-message-18 = Вы выиграли билеты на боевик РОБАСТБОРГ
messenger-spam-lottery-message-19 = Вы выиграли билеты на драму 28 ОТТЕНКОВ ВУЛЬПАКИН
messenger-spam-lottery-message-20 = Вы выиграли билеты на новейший триллер ЕРЕСЬ В ЦИРКЕ
# Events
messenger-spam-events-sender-1 = Тамада, баян, услуги
messenger-spam-events-sender-2 = Баянист Тамада Дискотека
messenger-spam-events-sender-3 = Свадьба за 1000 кредитов!
messenger-spam-events-sender-4 = Организуем праздники несмотря на легальность!
messenger-spam-events-message-1 = Увлекательные конкусы для ВАШЕЙ свадьбы!
messenger-spam-events-message-2 = Невесты РЫДАЮТ от радости! Женихи теряют сознание от счастья!
messenger-spam-events-message-3 = 7227051245544 — Игорь
messenger-spam-events-message-4 = Только лучшие аниматоры со всего сектора! Специализированные конкурсы для сотрудников Nanotrasen! Посвящение в капитаны! Торт для начальника службы безопасности!
messenger-spam-events-message-5 = я играть музыка кляссный беру дешево пиши да
# Emergency
messenger-spam-emergency-sender-1 = МАМА ПОМОГИ!
messenger-spam-emergency-sender-2 = СРОЧНО!
messenger-spam-emergency-sender-3 = Папа, я вляпался
messenger-spam-emergency-sender-4 = ПОЖАЛУЙСТА!
messenger-spam-emergency-message-1 = я врезался в корабль и офицер говорит что можно всё замять за 10000 кредитов, переведи пожалуйста
messenger-spam-emergency-message-2 = ОНА САМА УМЕРЛА, Я НЕ ВИНОВАТ! УМОЛЯЮ, МНЕ НУЖНО 5000 НА НОВЫЙ МУЛЬТИПАСПОРТ! СКОРЕЕ, ОНИ СКОРО БУДУТ ЗДЕСЬ
messenger-spam-emergency-message-3 = Меня машина убила! Переведи сколько можешь, иначе они не пришьют мне ноги обратно!
messenger-spam-emergency-message-4 = Это твой сын, памаги! пропорщик говорид что может памочь! Иго номир щёта 133782, банк развития Цыфея
# Cult
messenger-spam-cult-sender-1 = Церковь Всех-и-Сразу
messenger-spam-cult-sender-2 = Общественная организация «Слава Ран'ис»
messenger-spam-cult-sender-3 = Орден «ПРОТИВ ВУЛЬП»
messenger-spam-cult-sender-4 = Движение «ЗА ВУЛЬП»
messenger-spam-cult-sender-5 = КРОВЬ БОГУ КРОВИ
messenger-spam-cult-message-1 = Если вам небезразлично наше дело, заходите к нам по адресу: Сектор Ардей, планета Тифон-14, здание №1756B, этаж -76, офис 4
messenger-spam-cult-message-2 = Наши идею могут показаться немного радикальными, но, уверяю вас, это всего лишь слухи. Напоминаем, что следущая всеобщая молитва в пятницу, и приносите жертвоприношения с собой.
messenger-spam-cult-message-3 = Привет! Тебе одиноко? Не видишь смысла в жизни? Ну что ж, тогда мы будем рады тебе! Всего за 500 кредитов в месяц ты можешь вступить в наше дружное общество.
messenger-spam-cult-message-4 = Вам же не всё равно? А?! Или всё равно?! Ты бесхребетная крыса или уверенный в себе гуманоид?! Если у тебя кишка не тонка, то найдёшь нас сам.
messenger-spam-cult-message-5 = Пожалуйста, спасите меня, я здесь против своей воли.
messenger-spam-cult-message-6 = Вы уверены что живёте праведной жизнью? Если нет, пошлите нам 100 кредитов и мы помолимся за вас. Если да, то тоже пошлите, нам нужны пожертвования.
messenger-spam-cult-message-7 = Мы знаем. Мы найдём тебя сами, не нужно ничего делать.
# Pets
messenger-spam-pets-sender-1 = Экзотические питомцы
messenger-spam-pets-sender-2 = Друзья наши меньшие
messenger-spam-pets-sender-3 = Питомцы, домашние и не очень
messenger-spam-pets-sender-4 = Торговцы Элизиума
messenger-spam-pets-message-1 = Торговый корабль «Пупсик» приглашает вас к себе на борт. Большой выбор свиней и кабанов самых разных пород, включая редких взрывных.
messenger-spam-pets-message-2 = Дикие родственники таяр, вульпакин, воксов, киданов, унатхов, людей в ассортименте. Внимание! Владение нашим товаром может быть запрещено вашим законодательством!
messenger-spam-pets-message-3 = Если вы не купите у нас хоть что-то, мы пристрелим щенка. Вы думаете я шучу? У вас есть 1 час.
messenger-spam-pets-message-4 = ГРОМ 74 27 99 14. Геннадий, Роман, Олег, Михаил, 7 4 2 7 9 9 1 4
messenger-spam-pets-message-5 = Магазин «Мышеловка»! Мыши, крысы, большие и маленькие, плотоядные и не очень! При покупке колесо сыра в подарок! Одобрено Федерацией Мышей!
messenger-spam-pets-message-6 = Огромный выбор питомцев, вкусные корма, защита от блох и вшей и акссесуары для друзей наших меньших, а так же вульпакин и таяр.
# Weapons
messenger-spam-weapons-sender-1 = Оружие для всей семьи
messenger-spam-weapons-sender-2 = Стволы по дешёвке
messenger-spam-weapons-sender-3 = ПУШКИ ПУШКИ ПУШКИ
messenger-spam-weapons-sender-4 = Большие пушки для больших парней
messenger-spam-weapons-sender-5 = Мануфактура «У Бобби»
messenger-spam-weapons-message-1 = Самый большой выбор огнестрела в секторе. От дамских пистолетов до снайперской винтовки! Для совершения покупки требуется лицензия на владение оружием.
messenger-spam-weapons-message-2 = Лучшее от Синдиката. Пистолет %УДАЛЕНО%, усыпляющая %УДАЛЕНО%, пробивающая стены %УДАЛЕНО% и даже легендарный %УДАЛЕНО% меч. Агентам скидки, сотрудникам НТ бесплатн…9э%8%?3Р1… ВНИМАНИЕ! Перехвачено враждебное сообщение. Не обращайте внимания. Возвращайтесь к работе. Слава Nanotrasen!
messenger-spam-weapons-message-3 = Нужно что-то особое? Как насчёт магнума что сделает дыру в стене из пластали? Пневматический зонтик-ружьё? Надувной клоун со взрывчаткой внутри? Если вы об этом подумали, у нас это есть.
messenger-spam-weapons-message-4 = Давай к делу. Тебе нужно оружие? Меня зовут Борис и у меня для тебя есть пушки. Не спрашивай откуда, просто покупай.
messenger-spam-weapons-message-5 = Гранаты. Дымовые шашки. Тротил. Бомбы. Снаряды. Мины. С4. Ракеты. Биологическое оружие. Ядерные боеголовки. Распродажа! Успей, пока не урвали! Никаких лицензий, только бабки!
# Error
messenger-spam-error-sender-1 = ОШ;Б…;кА
messenger-spam-error-sender-2 = 25-j*%...o1q
messenger-spam-error-sender-3 = СБОЙ СИСТЕМЫ СООБЩЕНИЙ
messenger-spam-error-sender-4 = ОШИБКА
messenger-spam-error-message-1 = …от этого корабля, блядь. Ты кто такой, сука? Не пиши сюда больше блядь, я тебя найд…
messenger-spam-error-message-2 = …имание, агент. Дальше будут перечислены ваши цели. Никто не должен уйти живым. Первую цель зов…
messenger-spam-error-message-3 = …ася, хватить, блядь! Водки он напился, идиот. У НАС ЗАВТРА НА ТРАНС СОЛНЕЧНУЮ ФЕДЕРАЦИЮ НАЛЁТ, КАКАЯ ВОДКА! Сука, офицер СССП ещё называе…
messenger-spam-error-message-4 = …ы меня не любишь? Потому что я скрелл?! …извини, я сорвалась. Я вся на нервах из-за работы… Прилетай ко мне, я соску…
messenger-spam-error-message-5 = …еальные стулья! У нас лучшие стулья в секторе! С обивкой и без, с кожей и с инкрустированным ураном! Есть даже передвижные стулья с педалями! Кроме тог…
messenger-spam-error-message-6 = …а сковороду тем временем налейте еще немного масла и выложите тертую свеклу. Обжарьте пару минут и добавьте уксус. Тушите еще минут 5, а после выложите томатную пасту. Томите на медленном огне еще 5-7 минут. Зате…

View file

@ -29,6 +29,7 @@
- BaseStationNanotrasen
- BaseStationDeliveries
# Sunrise-Start
- BaseStationSpam
- BaseStationTransitHub
- BaseStationDontSelling
- BaseStationPlanetPrison

View file

@ -0,0 +1,167 @@
- type: localizedDataset
id: MessengerSpamCasinoSenders
values:
prefix: messenger-spam-casino-sender-
count: 4
- type: localizedDataset
id: MessengerSpamCasinoMessages
values:
prefix: messenger-spam-casino-message-
count: 7
- type: localizedDataset
id: MessengerSpamDatingSenders
values:
prefix: messenger-spam-dating-sender-
count: 7
- type: localizedDataset
id: MessengerSpamDatingMessages
values:
prefix: messenger-spam-dating-message-
count: 19
- type: localizedDataset
id: MessengerSpamFinanceSenders
values:
prefix: messenger-spam-finance-sender-
count: 5
- type: localizedDataset
id: MessengerSpamFinanceMessages
values:
prefix: messenger-spam-finance-message-
count: 6
- type: localizedDataset
id: MessengerSpamMedicineSenders
values:
prefix: messenger-spam-medicine-sender-
count: 3
- type: localizedDataset
id: MessengerSpamMedicineMessages
values:
prefix: messenger-spam-medicine-message-
count: 4
- type: localizedDataset
id: MessengerSpamPrinceSenders
values:
prefix: messenger-spam-prince-sender-
count: 5
- type: localizedDataset
id: MessengerSpamPrinceNames
values:
prefix: messenger-spam-prince-name-
count: 6
- type: localizedDataset
id: MessengerSpamPrinceSurnames
values:
prefix: messenger-spam-prince-surname-
count: 6
- type: localizedDataset
id: MessengerSpamPrinceMessages
values:
prefix: messenger-spam-prince-message-
count: 5
- type: localizedDataset
id: MessengerSpamAdultSenders
values:
prefix: messenger-spam-adult-sender-
count: 4
- type: localizedDataset
id: MessengerSpamAdultMessages
values:
prefix: messenger-spam-adult-message-
count: 4
- type: localizedDataset
id: MessengerSpamLotterySenders
values:
prefix: messenger-spam-lottery-sender-
count: 4
- type: localizedDataset
id: MessengerSpamLotteryMessages
values:
prefix: messenger-spam-lottery-message-
count: 20
- type: localizedDataset
id: MessengerSpamEventsSenders
values:
prefix: messenger-spam-events-sender-
count: 4
- type: localizedDataset
id: MessengerSpamEventsMessages
values:
prefix: messenger-spam-events-message-
count: 5
- type: localizedDataset
id: MessengerSpamEmergencySenders
values:
prefix: messenger-spam-emergency-sender-
count: 4
- type: localizedDataset
id: MessengerSpamEmergencyMessages
values:
prefix: messenger-spam-emergency-message-
count: 4
- type: localizedDataset
id: MessengerSpamCultSenders
values:
prefix: messenger-spam-cult-sender-
count: 5
- type: localizedDataset
id: MessengerSpamCultMessages
values:
prefix: messenger-spam-cult-message-
count: 7
- type: localizedDataset
id: MessengerSpamPetsSenders
values:
prefix: messenger-spam-pets-sender-
count: 4
- type: localizedDataset
id: MessengerSpamPetsMessages
values:
prefix: messenger-spam-pets-message-
count: 6
- type: localizedDataset
id: MessengerSpamWeaponsSenders
values:
prefix: messenger-spam-weapons-sender-
count: 5
- type: localizedDataset
id: MessengerSpamWeaponsMessages
values:
prefix: messenger-spam-weapons-message-
count: 5
- type: localizedDataset
id: MessengerSpamErrorSenders
values:
prefix: messenger-spam-error-sender-
count: 4
- type: localizedDataset
id: MessengerSpamErrorMessages
values:
prefix: messenger-spam-error-message-
count: 6

View file

@ -105,3 +105,9 @@
abstract: true
components:
- type: StationRandomXenoArtifact
- type: entity
id: BaseStationSpam
abstract: true
components:
- type: StationMessengerSpam

View file

@ -0,0 +1,66 @@
- type: messengerSpam
id: SpamCasino
senderDataset: MessengerSpamCasinoSenders
messageDataset: MessengerSpamCasinoMessages
- type: messengerSpam
id: SpamDating
senderDataset: MessengerSpamDatingSenders
messageDataset: MessengerSpamDatingMessages
- type: messengerSpam
id: SpamFinance
senderDataset: MessengerSpamFinanceSenders
messageDataset: MessengerSpamFinanceMessages
- type: messengerSpam
id: SpamMedicine
senderDataset: MessengerSpamMedicineSenders
messageDataset: MessengerSpamMedicineMessages
- type: messengerSpam
id: SpamPrince
senderDataset: MessengerSpamPrinceSenders
nameDataset: MessengerSpamPrinceNames
surnameDataset: MessengerSpamPrinceSurnames
messageDataset: MessengerSpamPrinceMessages
- type: messengerSpam
id: SpamAdult
senderDataset: MessengerSpamAdultSenders
messageDataset: MessengerSpamAdultMessages
- type: messengerSpam
id: SpamLottery
senderDataset: MessengerSpamLotterySenders
messageDataset: MessengerSpamLotteryMessages
- type: messengerSpam
id: SpamEvents
senderDataset: MessengerSpamEventsSenders
messageDataset: MessengerSpamEventsMessages
- type: messengerSpam
id: SpamEmergency
senderDataset: MessengerSpamEmergencySenders
messageDataset: MessengerSpamEmergencyMessages
- type: messengerSpam
id: SpamCult
senderDataset: MessengerSpamCultSenders
messageDataset: MessengerSpamCultMessages
- type: messengerSpam
id: SpamPets
senderDataset: MessengerSpamPetsSenders
messageDataset: MessengerSpamPetsMessages
- type: messengerSpam
id: SpamWeapons
senderDataset: MessengerSpamWeaponsSenders
messageDataset: MessengerSpamWeaponsMessages
- type: messengerSpam
id: SpamError
senderDataset: MessengerSpamErrorSenders
messageDataset: MessengerSpamErrorMessages

View file

@ -182,7 +182,9 @@ ignore_list:
- 'Net-ERR*?*%'
- 'Holo Girl'
- 'RobustChat'
- 'www.wetskrell.nt'
- '25-j*%...o1q'
ignore_files:
- 'italian.ftl'
- 'russian.ftl'