diff --git a/OpenBullet/Pages/StackerBlocks/PageBlockFunction.xaml.cs b/OpenBullet/Pages/StackerBlocks/PageBlockFunction.xaml.cs
index 5b8dc92..8eb8003 100644
--- a/OpenBullet/Pages/StackerBlocks/PageBlockFunction.xaml.cs
+++ b/OpenBullet/Pages/StackerBlocks/PageBlockFunction.xaml.cs
@@ -115,6 +115,7 @@ namespace OpenBullet.Pages.StackerBlocks
{ "Constant", "This will just return anything written in the input string and store it in a variable, after possibly replacing all the input variables.\nUse this to chain constants and variables together." },
{ "Hash", "The input string will be hashed with the selected function. Remember you can chain variables if you need a salt." },
{ "HMAC", "" },
+ { "RandomString", "L = Lowercase, U = Uppercase, D = Digit, S = Symbol, A = Any"},
{ "Translate", "Format like headers (this: that), one per line." },
{ "Compute", "Calculates the value of a math expression, for example (6+3)*5 will return 45." },
{ "RSA", "Thanks to TheLittleTrain17 for this implementation" },
diff --git a/RuriLib/Blocks/BlockFunction.cs b/RuriLib/Blocks/BlockFunction.cs
index 49c8704..4edf7f4 100644
--- a/RuriLib/Blocks/BlockFunction.cs
+++ b/RuriLib/Blocks/BlockFunction.cs
@@ -78,6 +78,9 @@ namespace RuriLib
/// Generates a random integer.
RandomNum,
+ /// Generates a random string based on a mask.
+ RandomString,
+
/// Rounds a decimal input to the upper integer.
Ceil,
@@ -584,6 +587,22 @@ namespace RuriLib
outputString = (data.rand.Next(randomMin, randomMax)).ToString();
break;
+ case Function.RandomString:
+ var lowercase = "abcdefghijklmnopqrstuvwxyz";
+ var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ var digits = "0123456789";
+ var symbols = "\\!\"£$%&/()=?^'{}[]@#,;.:-_*+";
+ var allchars = lowercase + uppercase + digits + symbols;
+ outputString = new string(localInputString
+ .ToCharArray()
+ .Select(c => c == 'L' ? lowercase[data.rand.Next(0, lowercase.Length)] : c)
+ .Select(c => c == 'U' ? uppercase[data.rand.Next(0, uppercase.Length)] : c)
+ .Select(c => c == 'D' ? digits[data.rand.Next(0, digits.Length)] : c)
+ .Select(c => c == 'S' ? symbols[data.rand.Next(0, symbols.Length)] : c)
+ .Select(c => c == 'A' ? allchars[data.rand.Next(0, allchars.Length)] : c)
+ .ToArray());
+ break;
+
case Function.Ceil:
outputString = Math.Ceiling(Decimal.Parse(localInputString, style, provider)).ToString();
break;