summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorLoren Burkholder <computersemiexpert@outlook.com>2024-02-27 13:13:08 -0500
committerLoren Burkholder <computersemiexpert@outlook.com>2024-02-27 13:17:20 -0500
commit21d51d9739996266f7f515c56c79754010357a17 (patch)
treec0e2649a1ff1e9ab7a710f7af8eebc8dbbcce495 /src
parentAdd a glitch text command (diff)
downloadnheko-21d51d9739996266f7f515c56c79754010357a17.tar.xz
Add a command to gradually glitch text in a message
Diffstat (limited to 'src')
-rw-r--r--src/CommandCompleter.cpp6
-rw-r--r--src/CommandCompleter.h1
-rw-r--r--src/Utils.cpp52
-rw-r--r--src/Utils.h3
-rw-r--r--src/timeline/InputBar.cpp3
5 files changed, 57 insertions, 8 deletions
diff --git a/src/CommandCompleter.cpp b/src/CommandCompleter.cpp
index 67be642f..33e7ef2c 100644
--- a/src/CommandCompleter.cpp
+++ b/src/CommandCompleter.cpp
@@ -93,6 +93,8 @@ CommandCompleter::data(const QModelIndex &index, int role) const
                 return QStringLiteral("/msgtype ");
             case Glitch:
                 return QStringLiteral("/glitch ");
+            case GradualGlitch:
+                return QStringLiteral("/gradualglitch ");
             case Goto:
                 return QStringLiteral("/goto ");
             case ConvertToDm:
@@ -174,6 +176,8 @@ CommandCompleter::data(const QModelIndex &index, int role) const
                 return tr("/goto <message reference>");
             case Glitch:
                 return tr("/glitch <message>");
+            case GradualGlitch:
+                return tr("/gradualglitch <message>");
             case ConvertToDm:
                 return QStringLiteral("/converttodm");
             case ConvertToRoom:
@@ -251,6 +255,8 @@ CommandCompleter::data(const QModelIndex &index, int role) const
                 return tr("Send a message with a custom message type.");
             case Glitch:
                 return tr("Send a message with a glitch effect.");
+            case GradualGlitch:
+                return tr("Send a message that gradually glitches.");
             case Goto:
                 return tr("Go to a specific message using an event id, index or matrix: link");
             case ConvertToDm:
diff --git a/src/CommandCompleter.h b/src/CommandCompleter.h
index 44b192c3..9dc18119 100644
--- a/src/CommandCompleter.h
+++ b/src/CommandCompleter.h
@@ -49,6 +49,7 @@ public:
         Rainfall,
         Msgtype,
         Glitch,
+        GradualGlitch,
         Goto,
         ConvertToDm,
         ConvertToRoom,
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 253b3761..3151d017 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -2014,24 +2014,60 @@ utils::removeExpiredEvents()
     ApplyEventExpiration::next(std::move(asus));
 }
 
+namespace {
+static const QList<QChar> diacritics = []() {
+    QList<QChar> ret;
+    for (wchar_t c = u'\u0300'; c <= u'\u036f'; ++c)
+        ret.append(QChar(c));
+    return ret;
+}();
+}
+
 QString
 utils::glitchText(const QString &text)
 {
-    static const QList<QChar> diacritics = []() {
-        QList<QChar> ret;
-        for (wchar_t c = u'\u0300'; c <= u'\u036f'; ++c)
-            ret.append(QChar(c));
-        return ret;
-    }();
-
     QString result;
-
     for (int i = 0; i < text.size(); ++i) {
         result.append(text.at(i));
         if (QRandomGenerator64::global()->bounded(0, 100) >= 25)
             result.append(
               diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size())));
     }
+    return result;
+}
+
+QString
+utils::graduallyGlitchText(const QString &text)
+{
+    QString result;
+
+    const int noGlitch     = text.size() * 0.5;
+    const int someGlitch   = text.size() * 0.8;
+    const int lotsOfGlitch = text.size() * 0.95;
+
+    for (int i = 0; i < text.size(); ++i) {
+        result.append(text.at(i));
+
+        if (i < noGlitch) // first 40% of text is normal
+            continue;
+        else if (i < someGlitch) // next 25% is progressively glitchier
+        {
+            if (QRandomGenerator64::global()->bounded(noGlitch, someGlitch) <
+                noGlitch + (i - noGlitch) * 0.05)
+                result.append(
+                  diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size())));
+        } else if (i < lotsOfGlitch) { // oh no, it's spreading!
+            if (QRandomGenerator64::global()->bounded(someGlitch, lotsOfGlitch) < i)
+                result.append(
+                  diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size())));
+        } else { // just give up, your computer is cursed now
+            do {
+                if (QRandomGenerator64::global()->bounded(text.size() / 5, text.size()) < i)
+                    result.append(
+                      diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size())));
+            } while (QRandomGenerator64::global()->bounded(0, 100) < 35);
+        }
+    }
 
     return result;
 }
diff --git a/src/Utils.h b/src/Utils.h
index 1f477485..75438a7b 100644
--- a/src/Utils.h
+++ b/src/Utils.h
@@ -208,4 +208,7 @@ removeExpiredEvents();
 
 QString
 glitchText(const QString &text);
+
+QString
+graduallyGlitchText(const QString &text);
 }
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index f29b806c..62d38cf5 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -239,6 +239,7 @@ InputBar::updateTextContentProperties(const QString &t)
                                              QStringLiteral("rainfall"),
                                              QStringLiteral("msgtype"),
                                              QStringLiteral("glitch"),
+                                             QStringLiteral("gradualglitch"),
                                              QStringLiteral("goto"),
                                              QStringLiteral("converttodm"),
                                              QStringLiteral("converttoroom"),
@@ -921,6 +922,8 @@ InputBar::command(const QString &command, QString args)
         customMsgtype(args.section(' ', 0, 0), args.section(' ', 1, -1));
     } else if (command == QLatin1String("glitch")) {
         message(utils::glitchText(args));
+    } else if (command == QLatin1String("gradualglitch")) {
+        message(utils::graduallyGlitchText(args));
     } else if (command == QLatin1String("goto")) {
         // Goto has three different modes:
         // 1 - Going directly to a given event ID