diff --git a/config/example/config.toml b/config/example/config.toml index 2ce5f3f8d0ca..bd183434d75c 100644 --- a/config/example/config.toml +++ b/config/example/config.toml @@ -978,6 +978,11 @@ ffmpeg_cpuaffinity = "" force_discord_verification = false # Respawn delay in minutes before one may respawn as a crew member respawn_delay = 20 +# Enable speech filter for players. +# If enabled, some words will be removed from player's messages. +enable_speech_filter = false +# List of ckeys, that bypass speech filter. +speech_filter_bypass = [] ################################################################ diff --git a/config/speech_filters/brainrot_filter.json b/config/speech_filters/brainrot_filter.json new file mode 100644 index 000000000000..1a1133cbb36f --- /dev/null +++ b/config/speech_filters/brainrot_filter.json @@ -0,0 +1,3 @@ +{ + "brainrot_filter": [] +} diff --git a/librust_utils.dll b/librust_utils.dll new file mode 100644 index 000000000000..a96405068e77 Binary files /dev/null and b/librust_utils.dll differ diff --git a/modular_ss220/_rust_utils/_rust_utils.dm b/modular_ss220/_rust_utils/_rust_utils.dm new file mode 100644 index 000000000000..c9c35792e08f --- /dev/null +++ b/modular_ss220/_rust_utils/_rust_utils.dm @@ -0,0 +1,4 @@ +/datum/modpack/rust_utils + name = "Rust Utils" + desc = "Набор утилит на rust" + author = "furior, gaxeer" diff --git a/modular_ss220/_rust_utils/_rust_utils.dme b/modular_ss220/_rust_utils/_rust_utils.dme new file mode 100644 index 000000000000..a0635e8a4890 --- /dev/null +++ b/modular_ss220/_rust_utils/_rust_utils.dme @@ -0,0 +1,3 @@ +#include "_rust_utils.dm" + +#include "code/rust_utils.dm" diff --git a/modular_ss220/_rust_utils/code/rust_utils.dm b/modular_ss220/_rust_utils/code/rust_utils.dm new file mode 100644 index 000000000000..f12cf9570c87 --- /dev/null +++ b/modular_ss220/_rust_utils/code/rust_utils.dm @@ -0,0 +1,28 @@ +#ifndef RUST_UTILS + +/* This comment bypasses grep checks */ /var/__rust_utils + +/proc/__detect_rust_utils() + if(world.system_type == UNIX) + if(fexists("./librust_utils.so")) + // No need for LD_LIBRARY_PATH badness. + return __rust_utils = "./librust_utils.so" + else + // It's not in the current directory, so try others + return __rust_utils = "librust_utils.so" + else + return __rust_utils = "librust_utils" + +#define RUST_UTILS (__rust_utils || __detect_rust_utils()) +#endif + +/// Gets the version of rust_utils +/proc/rust_utils_get_version() return RUSTG_CALL(RUST_UTILS, "get_version")() + +#define rustutils_file_write_b64decode(text, fname) RUSTG_CALL(RUST_UTILS, "file_write")(text, fname, "true") + +#define rustutils_regex_replace(text, re, re_params, replacement) RUSTG_CALL(RUST_UTILS, "regex_replace")(text, re, re_params, replacement) + +#define rustutils_cyrillic_to_latin(text) RUSTG_CALL(RUST_UTILS, "cyrillic_to_latin")("[text]") +#define rustutils_latin_to_cyrillic(text) RUSTG_CALL(RUST_UTILS, "latin_to_cyrillic")("[text]") + diff --git a/modular_ss220/modular_ss220.dme b/modular_ss220/modular_ss220.dme index ea9cd5c9cff3..3ec7869b8001 100644 --- a/modular_ss220/modular_ss220.dme +++ b/modular_ss220/modular_ss220.dme @@ -4,6 +4,7 @@ // #include "example/_example.dme" // --- MAINTENANCE --- // +#include "_rust_utils/_rust_utils.dme" #include "_components/_components.dme" #include "_defines220/_defines220.dme" #include "_signals220/_signals220.dme" @@ -83,6 +84,7 @@ #include "antagonists/_antagonists_vox_raiders.dme" #include "uplink_items/_uplink_items.dme" #include "shuttles/_shuttles.dme" +#include "speech_filter/_speech_filter.dme" #include "redis220/_redis220.dme" #include "robolimbs/_robolimbs.dme" diff --git a/modular_ss220/species_whitelist/_species_whitelist.dm b/modular_ss220/species_whitelist/_species_whitelist.dm index 308df37ef295..a1a989b77f5f 100644 --- a/modular_ss220/species_whitelist/_species_whitelist.dm +++ b/modular_ss220/species_whitelist/_species_whitelist.dm @@ -1,4 +1,4 @@ -/datum/modpack/discord_link +/datum/modpack/species_whitelist name = "Вайтлист на расы" desc = "Добавление вайтлиста на расы" author = "legendaxe" diff --git a/modular_ss220/speech_filter/_speech_filter.dm b/modular_ss220/speech_filter/_speech_filter.dm new file mode 100644 index 000000000000..39645afd4dec --- /dev/null +++ b/modular_ss220/speech_filter/_speech_filter.dm @@ -0,0 +1,4 @@ +/datum/modpack/speech_filter + name = "Фильтр речи" + desc = "Фильтрация речи игроков" + author = "gaxeer" diff --git a/modular_ss220/speech_filter/_speech_filter.dme b/modular_ss220/speech_filter/_speech_filter.dme new file mode 100644 index 000000000000..dedff6323165 --- /dev/null +++ b/modular_ss220/speech_filter/_speech_filter.dme @@ -0,0 +1,5 @@ +#include "_speech_filter.dm" + +#include "code/configuration.dm" +#include "code/mob.dm" +#include "code/speech_filter.dm" diff --git a/modular_ss220/speech_filter/code/configuration.dm b/modular_ss220/speech_filter/code/configuration.dm new file mode 100644 index 000000000000..8967cbebfb58 --- /dev/null +++ b/modular_ss220/speech_filter/code/configuration.dm @@ -0,0 +1,14 @@ +/datum/configuration_section/ss220_misc_configuration + /// Whether or not player speech will be filtered + var/enable_speech_filter = FALSE + /// Set of player ckeys that bypass speech filter + var/list/speech_filter_bypass = list() + +/datum/configuration_section/ss220_misc_configuration/load_data(list/data) + . = ..() + CONFIG_LOAD_BOOL(enable_speech_filter, data["enable_speech_filter"]) + + var/list/filter_bypass + CONFIG_LOAD_LIST(filter_bypass, data["speech_filter_bypass"]) + for(var/whitelisted_ckey in filter_bypass) + speech_filter_bypass[ckey(whitelisted_ckey)] = TRUE diff --git a/modular_ss220/speech_filter/code/mob.dm b/modular_ss220/speech_filter/code/mob.dm new file mode 100644 index 000000000000..c21c26edaf77 --- /dev/null +++ b/modular_ss220/speech_filter/code/mob.dm @@ -0,0 +1,3 @@ +/mob/living/Login() + . = ..() + AddElement(/datum/element/speech_filter, src) diff --git a/modular_ss220/speech_filter/code/speech_filter.dm b/modular_ss220/speech_filter/code/speech_filter.dm new file mode 100644 index 000000000000..6a7c592941a6 --- /dev/null +++ b/modular_ss220/speech_filter/code/speech_filter.dm @@ -0,0 +1,73 @@ +#define BRAINROT_FILTER_FILE "config/speech_filters/brainrot_filter.json" + +/datum/element/speech_filter + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + var/static/list/brainrot_notifications = list( + "Почему у меня такой скудный словарный запас? Стоит сходить в библиотеку и прочесть книгу...", + "Что, черт побери, я несу?", + "Я в своём уме? Надо следить за языком.", + "Неужели я не могу подобрать нужных слов? Позор мне..." + ) + +/datum/element/speech_filter/Attach(datum/target) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + var/mob/mob_to_censor = target + if(!mob_to_censor.client) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(mob_to_censor, COMSIG_MOB_SAY, PROC_REF(filter_speech), TRUE) + RegisterSignal(mob_to_censor, COMSIG_MOB_LOGOUT, PROC_REF(Detach), TRUE) + +/datum/element/speech_filter/Detach(datum/source, force) + . = ..() + UnregisterSignal(source, COMSIG_MOB_SAY) + UnregisterSignal(source, COMSIG_MOB_LOGOUT) + +/datum/element/speech_filter/proc/filter_speech(mob/talker, list/speech_args) + if(!GLOB.configuration.ss220_misc.enable_speech_filter || can_bypass_filter(talker)) + return + + var/message = speech_args[SPEECH_MESSAGE] + if(!length(message)) + return + + if(message[1] == "*") + return + + var/brainrot_regex = get_brainrot_filter_regex() + if(!brainrot_regex) + return + + var/original_message = copytext(message, 1) + message = rustutils_regex_replace(message, brainrot_regex, "i", "цветочек") + if(original_message == message) + return + + speech_args[SPEECH_MESSAGE] = message + addtimer(CALLBACK(talker, TYPE_PROC_REF(/mob, emote), "drool"), 0.3 SECONDS) + to_chat(talker, span_sinister(pick(brainrot_notifications))) + log_and_message_admins("[key_name(talker)] has attempted to say forbidden word. His message was: [original_message]") + +/datum/element/speech_filter/proc/get_brainrot_filter_regex() + if(!fexists(BRAINROT_FILTER_FILE)) + return + + var/static/list/filters = json_load(BRAINROT_FILTER_FILE)["brainrot_filter"] + if(!length(filters)) + return list() + + var/static/brainrot_regex + if(!brainrot_regex) + var/list/unique_filters = list() + unique_filters |= filters + brainrot_regex = unique_filters.Join("|") + + return brainrot_regex + +/datum/element/speech_filter/proc/can_bypass_filter(mob/mob_to_check) + return mob_to_check.client.ckey in GLOB.configuration.ss220_misc.speech_filter_bypass + +#undef BRAINROT_FILTER_FILE diff --git a/modular_ss220/text_to_speech/_tts.dme b/modular_ss220/text_to_speech/_tts.dme index 8af372dd0b12..bcefa2889606 100644 --- a/modular_ss220/text_to_speech/_tts.dme +++ b/modular_ss220/text_to_speech/_tts.dme @@ -5,7 +5,6 @@ #include "code/hear.dm" #include "code/numbers.dm" #include "code/providers/silero.dm" -#include "code/rust_g_ss220.dm" #include "code/seeds/base.dm" #include "code/seeds/silero.dm" #include "code/sound.dm" diff --git a/modular_ss220/text_to_speech/code/rust_g_ss220.dm b/modular_ss220/text_to_speech/code/rust_g_ss220.dm deleted file mode 100644 index e14dbc38aba7..000000000000 --- a/modular_ss220/text_to_speech/code/rust_g_ss220.dm +++ /dev/null @@ -1,48 +0,0 @@ -// rust_g_ss220.dm - DM API for rust_g_ss220 extension library -// -// To configure, create a `rust_g_ss220.config.dm` and set what you care about from -// the following options: -// -// #define RUST_G_SS220 "path/to/rust_g_ss220" -// Override the .dll/.so detection logic with a fixed path or with detection -// logic of your own. -// -// #define RUSTG_OVERRIDE_BUILTINS -// Enable replacement rust-g functions for certain builtins. Off by default. - -#ifndef RUST_G_SS220 -// Default automatic RUST_G_SS220 detection. -// On Windows, looks in the standard places for `rust_g_ss220.dll`. -// On Linux, looks in `.`, `$LD_LIBRARY_PATH`, and `~/.byond/bin` for either of -// `librust_g_ss220.so` (preferred) or `rust_g_ss220` (old). - -/* This comment bypasses grep checks */ /var/__rust_g_ss220 - -/proc/__detect_rust_g_ss220() - if(world.system_type == UNIX) - if(fexists("./librust_g_ss220.so")) - // No need for LD_LIBRARY_PATH badness. - return __rust_g_ss220 = "./librust_g_ss220.so" - else if(fexists("./rust_g_ss220")) - // Old dumb filename. - return __rust_g_ss220 = "./rust_g_ss220" - else if(fexists("[world.GetConfig("env", "HOME")]/.byond/bin/rust_g_ss220")) - // Old dumb filename in `~/.byond/bin`. - return __rust_g_ss220 = "rust_g_ss220" - else - // It's not in the current directory, so try others - return __rust_g_ss220 = "librust_g_ss220.so" - else - return __rust_g_ss220 = "rust_g_ss220" - -#define RUST_G_SS220 (__rust_g_ss220 || __detect_rust_g_ss220()) -#endif - -/// Gets the version of rust_g -/proc/rustg_ss220_get_version() return RUSTG_CALL(RUST_G_SS220, "get_version")() - -#define rustg_ss220_file_write_b64decode(text, fname) RUSTG_CALL(RUST_G_SS220, "file_write")(text, fname, "true") - -// Text Operations // -#define rustg_ss220_cyrillic_to_latin(text) RUSTG_CALL(RUST_G_SS220, "cyrillic_to_latin")("[text]") -#define rustg_ss220_latin_to_cyrillic(text) RUSTG_CALL(RUST_G_SS220, "latin_to_cyrillic")("[text]") diff --git a/modular_ss220/text_to_speech/code/tts_subsystem.dm b/modular_ss220/text_to_speech/code/tts_subsystem.dm index ae0b247407cf..c5c98391c66c 100644 --- a/modular_ss220/text_to_speech/code/tts_subsystem.dm +++ b/modular_ss220/text_to_speech/code/tts_subsystem.dm @@ -410,7 +410,7 @@ SUBSYSTEM_DEF(tts220) if(!voice) return - rustg_ss220_file_write_b64decode(voice, "[filename].ogg") + rustutils_file_write_b64decode(voice, "[filename].ogg") if(!GLOB.configuration.tts.tts_cache_enabled) addtimer(CALLBACK(src, PROC_REF(cleanup_tts_file), "[filename].ogg"), 30 SECONDS) @@ -557,7 +557,7 @@ SUBSYSTEM_DEF(tts220) . = replacetext_char(., acronyms, /proc/tts_acronym_replacer) for(var/job in tts_job_replacements) . = replacetext_char(., job, tts_job_replacements[job]) - . = rustg_ss220_latin_to_cyrillic(.) + . = rustutils_latin_to_cyrillic(.) var/static/regex/decimals = new(@"-?\d+\.\d+", "g") . = replacetext_char(., decimals, /proc/dec_in_words) diff --git a/modular_ss220/text_to_speech/code/~undefs/~undefs.dm b/modular_ss220/text_to_speech/code/~undefs/~undefs.dm index ce9c0cd7f236..c09e423220c4 100644 --- a/modular_ss220/text_to_speech/code/~undefs/~undefs.dm +++ b/modular_ss220/text_to_speech/code/~undefs/~undefs.dm @@ -11,12 +11,6 @@ #undef TTS_TRAIT_RATE_FASTER #undef TTS_TRAIT_RATE_MEDIUM -#undef rustg_ss220_file_write_b64decode - -// Text Operations // -#undef rustg_ss220_cyrillic_to_latin -#undef rustg_ss220_latin_to_cyrillic - #undef TTS_CATEGORY_OTHER #undef TTS_CATEGORY_WARCRAFT3 #undef TTS_CATEGORY_HALFLIFE2 diff --git a/rust_g_ss220.dll b/rust_g_ss220.dll deleted file mode 100644 index ef1d0ec0bdd5..000000000000 Binary files a/rust_g_ss220.dll and /dev/null differ diff --git a/tools/tgs_scripts/PreCompile.sh b/tools/tgs_scripts/PreCompile.sh index f43ca4d2b059..2a6b952a5e22 100644 --- a/tools/tgs_scripts/PreCompile.sh +++ b/tools/tgs_scripts/PreCompile.sh @@ -9,21 +9,9 @@ set -x #need to switch to game dir for Dockerfile weirdness original_dir=$PWD cd "$1" -. dependencies.sh +. _build_dependencies.sh cd "$original_dir" -git config --global user.name -if [ $? -eq 1 ] -then - git config --global user.name "paradise_tgs_script" -fi - -git config --global user.email -if [ $? -eq 1 ] -then - git config --global user.email "paradise_tgs_script@invalid.com" -fi - # update rust-g if [ ! -d "rust-g" ]; then echo "Cloning rust-g..." @@ -43,25 +31,24 @@ git reset --hard "$RUSTG_VERSION" cd paradise-rust-g env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --features all --target=i686-unknown-linux-gnu mv target/i686-unknown-linux-gnu/release/librust_g.so "$1/librust_g.so" -cd .. +cd ../../ -if [ ! -d "rust-g-tg" ]; then - echo "Cloning rust-g..." - git clone https://github.com/ss220club/rust-g-tg - cd rust-g-tg +if [ ! -d "rust-utils" ]; then + echo "Cloning rust-utils..." + git clone https://github.com/ss220club/rust-utils + cd rust-utils ~/.cargo/bin/rustup target add i686-unknown-linux-gnu else - echo "Fetching rust-g..." - cd rust-g-tg + echo "Fetching rust-utils..." + cd rust-utils git fetch ~/.cargo/bin/rustup target add i686-unknown-linux-gnu fi -echo "Deploying rust-g ss220..." +echo "Deploying rustutils..." RUSTFLAGS="-C target-cpu=native" -env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --features all --target=i686-unknown-linux-gnu -rm -f "$original_dir/../GameStaticFiles/librust_g_ss220.so" -mv target/i686-unknown-linux-gnu/release/librust_g.so "$original_dir/../GameStaticFiles/librust_g_ss220.so" +env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --all-features --target=i686-unknown-linux-gnu +mv target/i686-unknown-linux-gnu/release/librust_utils.so "$1/librust_utils.so" cd ../../ echo "Deploying MILLA..." diff --git a/tools/tgs_scripts/PreCompileSS220.sh b/tools/tgs_scripts/PreCompileSS220.sh deleted file mode 100644 index b34a8c4bdc73..000000000000 --- a/tools/tgs_scripts/PreCompileSS220.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -./InstallDeps.sh - -set -e -set -x - -#load dep exports -#need to switch to game dir for Dockerfile weirdness -original_dir=$PWD -cd "$1" -. _build_dependencies.sh -cd "$original_dir" - - -# update rust-g -if [ ! -d "rust-g" ]; then - echo "Cloning rust-g..." - git clone https://github.com/ParadiseSS13/rust-g - cd rust-g - git checkout "$RUSTG_VERSION" - . apply_patches.sh - ~/.cargo/bin/rustup target add i686-unknown-linux-gnu -else - echo "Fetching rust-g..." - cd rust-g - git checkout "$RUSTG_VERSION" - git fetch - ~/.cargo/bin/rustup target add i686-unknown-linux-gnu -fi - -cd paradise-rust-g -echo "Deploying rust-g..." - -env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --features all --target=i686-unknown-linux-gnu -mv target/i686-unknown-linux-gnu/release/librust_g.so "$1/librust_g.so" -cd ../.. - -if [ ! -d "rust-g-tg" ]; then - echo "Cloning rust-g..." - git clone https://github.com/ss220club/rust-g-tg - cd rust-g-tg - ~/.cargo/bin/rustup target add i686-unknown-linux-gnu -else - echo "Fetching rust-g..." - cd rust-g-tg - git fetch - ~/.cargo/bin/rustup target add i686-unknown-linux-gnu -fi - -echo "Deploying rust-g ss220..." -RUSTFLAGS="-C target-cpu=native" -env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --features all --target=i686-unknown-linux-gnu -rm -f "$original_dir/../GameStaticFiles/librust_g_ss220.so" -mv target/i686-unknown-linux-gnu/release/librust_g.so "$original_dir/../GameStaticFiles/librust_g_ss220.so" -cd ..