v0.22 files

This commit is contained in:
tduva 2023-01-15 05:21:11 +01:00
parent eee8280bcb
commit a4cde3fe41
No known key found for this signature in database
GPG Key ID: 01EB6B81F18C5128
7 changed files with 238 additions and 61 deletions

View File

@ -38,6 +38,8 @@ along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</pre
<li><a href="https://github.com/TooTallNate/Java-WebSocket">Java-WebSocket</a> (MIT), <a href="http://www.slf4j.org/">SLF4J</a> (MIT)</li> <li><a href="https://github.com/TooTallNate/Java-WebSocket">Java-WebSocket</a> (MIT), <a href="http://www.slf4j.org/">SLF4J</a> (MIT)</li>
<li><a href="http://www.jtattoo.net">JTattoo</a> by MH Software-Entwicklung <li><a href="http://www.jtattoo.net">JTattoo</a> by MH Software-Entwicklung
(<a href="http://www.gnu.org/licenses/gpl-3.0.txt">GPLv2 or later</a>)</li> (<a href="http://www.gnu.org/licenses/gpl-3.0.txt">GPLv2 or later</a>)</li>
<li><a href="https://www.formdev.com/flatlaf/">FlatLaf</a> by FormDev
(<a href="https://github.com/JFormDesigner/FlatLaf/blob/main/LICENSE">Apache License 2.0</a>)</li>
<li><a href="https://github.com/rjeschke/txtmark">Txtmark</a> <li><a href="https://github.com/rjeschke/txtmark">Txtmark</a>
(<a href="http://www.apache.org/licenses/LICENSE-2.0">"Apache License 2.0"</a>)</li> (<a href="http://www.apache.org/licenses/LICENSE-2.0">"Apache License 2.0"</a>)</li>
<li><a href="https://hc.apache.org/">Apache HttpComponents Client</a> (<a href="http://www.apache.org/licenses/LICENSE-2.0">"Apache License 2.0"</a>)</li> <li><a href="https://hc.apache.org/">Apache HttpComponents Client</a> (<a href="http://www.apache.org/licenses/LICENSE-2.0">"Apache License 2.0"</a>)</li>

View File

@ -233,7 +233,7 @@
<th>Description</th> <th>Description</th>
</tr> </tr>
<tr> <tr>
<th rowspan="10"><em>All</em></th> <th rowspan="9"><em>All</em></th>
<td><code>chan</code></td> <td><code>chan</code></td>
<td>The current channel context (without leading #)</td> <td>The current channel context (without leading #)</td>
</tr> </tr>
@ -247,10 +247,6 @@
<td>All currently open regular channels (separated by spaces, <td>All currently open regular channels (separated by spaces,
without leading #)</td> without leading #)</td>
</tr> </tr>
<tr>
<td><code>hostedChan</code></td>
<td>The currently hosted channel (if any)</td>
</tr>
<tr> <tr>
<td><code>streamstatus</code></td> <td><code>streamstatus</code></td>
<td>Stream Status (Title/Game or Offline)</td> <td>Stream Status (Title/Game or Offline)</td>
@ -443,15 +439,49 @@
replacement: replacement:
<code>$(1-) -> $<u>join</u>(1-<u>,/</u>)</code></p> <code>$(1-) -> $<u>join</u>(1-<u>,/</u>)</code></p>
<p>Functions by topic (ones marked with * are not available in every context):</p>
<ul>
<li>Decisions:
<a href="#func-if">$if()</a>,
<a href="#func-ifeq">$ifeq()</a>,
<a href="#func-switch">$switch()</a>,
<a href="#func-is">$is()</a>*
</li>
<li>Text:
<a href="#func-join">$join()</a>,
<a href="#func-lower">$lower()</a>,
<a href="#func-upper">$upper()</a>,
<a href="#func-trim">$trim()</a>,
<a href="#func-replace">$replace()</a>,
<a href="#func-rand">$rand()</a>,
<a href="#func-sort">$sort()</a>,
<a href="#func-input">$input()</a>
</li>
<li>Numbers:
<a href="#func-randnum">$randnum()</a>,
<a href="#func-calc">$calc()</a>,
<a href="#func-round">$round()</a>
</li>
<li>Requests/URLs:
<a href="#func-request">$request()</a>*,
<a href="#func-urlencode">$urlencode()</a>,
<a href="#func-json">$json()</a>
</li>
<li>Other:
<a href="#func-datetime">$datetime()</a>,
<a href="#func-get">$get()</a>*
</li>
</ul>
<p>The following functions are always available:</p> <p>The following functions are always available:</p>
<dl class="defList"> <dl class="defList">
<dt><code>$if(&lt;identifier&gt;,&lt;output if exists&gt;,[output if not])</code></dt> <dt><a name="func-if"><code>$if(&lt;identifier&gt;,&lt;output if exists&gt;,[output if not])</code></a></dt>
<dd>If the value the identifier refers to exists (non-empty), it will <dd>If the value the identifier refers to exists (non-empty), it will
return the first function parameter, the second otherwise.</dd> return the first function parameter, the second otherwise.</dd>
<dd><em>Example:</em> <code>$if(1,$1,nope)</code> with command parameters <code>cheese cake</code> turns into <code>cheese</code>, <dd><em>Example:</em> <code>$if(1,$1,nope)</code> with command parameters <code>cheese cake</code> turns into <code>cheese</code>,
with no parameters turns into <code>nope</code>, the optional <code>[output if not]</code> function parameter.</dd> with no parameters turns into <code>nope</code>, the optional <code>[output if not]</code> function parameter.</dd>
<dt><code>$ifeq(&lt;identifier&gt;,&lt;comparison&gt;,&lt;output if equal&gt;,[output if not])</code></dt> <dt><a name="func-ifeq"><code>$ifeq(&lt;identifier&gt;,&lt;comparison&gt;,&lt;output if equal&gt;,[output if not])</code></a></dt>
<dd>Similar to <code>$if</code>, but instead of just checking for the <dd>Similar to <code>$if</code>, but instead of just checking for the
existence of a parameter it compares it to a given value existence of a parameter it compares it to a given value
(<code>&lt;comparison&gt;</code>).</dd> (<code>&lt;comparison&gt;</code>).</dd>
@ -460,31 +490,36 @@
<code>cheese cake</code> turns into an an empty string, since the <code>cheese cake</code> turns into an an empty string, since the
optional <code>[output if not]</code> has not been specified.</dd> optional <code>[output if not]</code> has not been specified.</dd>
<dt><code>$switch(&lt;identifier&gt;,&lt;case1&gt;:&lt;result1&gt;,..,[casen]:[resultn],[default])</code></dt> <dt><a name="func-switch"><code>$switch(&lt;identifier&gt;,&lt;case1&gt;:&lt;result1&gt;,..,[casen]:[resultn],[default])</code></a></dt>
<dd>Similiar to a switch statement in programming, or one or several <code>$ifeq()</code> functions. <dd>Similiar to a switch statement in programming, or one or several <code>$ifeq()</code> functions.
Compares the value associated with the identifier with the case values and returns the following Compares the value associated with the identifier with the case values and returns the following
result if it matches. If none of the case values match, it will return the default, or an empty value.</dd> result if it matches. If none of the case values match, it will return the default, or an empty value.</dd>
<dd><em>Example:</em> <code>/set fontSize $switch($get(fontSize),25:50,50:18,25)</code> when added <dd><em>Example:</em> <code>/set fontSize $switch($get(fontSize),25:50,50:18,25)</code> when added
as a Custom Command alternates between font sizes 18, 25 and 50.</dd> as a Custom Command alternates between font sizes 18, 25 and 50.</dd>
<dt><code>$join(&lt;identifier&gt;,&lt;separator&gt;)</code></dt> <dt><a name="func-join"><code>$join(&lt;identifier&gt;,&lt;separator&gt;)</code></a></dt>
<dd>Joins together the arguments the identifier refers to, using the <dd>Joins together the arguments the identifier refers to, using the
given separator.</dd> given separator.</dd>
<dd><em>Example:</em> <code>$join(1-,/)</code> with <code>1-</code> referring to <dd><em>Example:</em> <code>$join(1-,/)</code> with <code>1-</code> referring to
<code>flour sugar eggs</code> turns into <code>flour/sugar/eggs</code></dd> <code>flour sugar eggs</code> turns into <code>flour/sugar/eggs</code></dd>
<dd>This effectively replaces spaces in the parameters with the separator.</dd> <dd>This effectively replaces spaces in the parameters with the separator.</dd>
<dt><code>$lower(&lt;identifier&gt;)</code></dt> <dt><a name="func-lower"><code>$lower(&lt;identifier&gt;)</code></a></dt>
<dd>Makes the given input lowercase.</dd> <dd>Makes the given input lowercase.</dd>
<dd><em>Example:</em> <code>$lower(1)</code> with <code>1</code> <dd><em>Example:</em> <code>$lower(1)</code> with <code>1</code>
referring to <code>Fremily</code> turns into <code>fremily</code>.</dd> referring to <code>Fremily</code> turns into <code>fremily</code>.</dd>
<dt><code>$upper(&lt;identifier&gt;)</code></dt> <dt><a name="func-upper"><code>$upper(&lt;identifier&gt;)</code></a></dt>
<dd>Makes the given input uppercase.</dd> <dd>Makes the given input uppercase.</dd>
<dd><em>Example:</em> <code>$upper(1)</code> with <code>1</code> <dd><em>Example:</em> <code>$upper(1)</code> with <code>1</code>
referring to <code>Fremily</code> turns into <code>FREMILY</code>.</dd> referring to <code>Fremily</code> turns into <code>FREMILY</code>.</dd>
<dt><code>$replace(&lt;input&gt;,&lt;search&gt;,&lt;replace&gt;,[method])</code> <dt><a name="func-trim"><code>$trim(&lt;input&gt;)</code></a></dt>
<dd>Removes leading and trailing space (U+0020 and lower, using the
<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#trim%28%29">String.trim()</a> method).</dd>
<dd><em>Example:</em> <code>$trim( abc )</code> turns into <code>abc</code>.</dd>
<dt><a name="func-replace"><code>$replace(&lt;input&gt;,&lt;search&gt;,&lt;replace&gt;,[method])</code></a></dt>
<dd>Search and replace in text.</dd> <dd>Search and replace in text.</dd>
<dd>Especially when using Regex, remember <dd>Especially when using Regex, remember
escaping <code>\</code> (<code>\\</code>) and <code>$</code> (<code>\$</code>) escaping <code>\</code> (<code>\\</code>) and <code>$</code> (<code>\$</code>)
@ -512,14 +547,14 @@
<dd><em>Example:</em> <code>$replace(Was timed out for 30 seconds,.*?(\\d+) seconds,Number of seconds: \$1,regRef)</code> turns into <code>Number of seconds: 30</code></dd> <dd><em>Example:</em> <code>$replace(Was timed out for 30 seconds,.*?(\\d+) seconds,Number of seconds: \$1,regRef)</code> turns into <code>Number of seconds: 30</code></dd>
<dd><em>Example:</em> <code>$replace($1-,$"~([a-z]+)~",<span style="text-decoration: underline">$replace($(g1),$"(\w)",$"$1+",regRef)</span>,regCustom)</code> adds <code>+</code> behind every character surrounded by <code>~</code> (the inner <code>$replace()</code> is in the <code>replace</code> parameter and executed for each match)</dd> <dd><em>Example:</em> <code>$replace($1-,$"~([a-z]+)~",<span style="text-decoration: underline">$replace($(g1),$"(\w)",$"$1+",regRef)</span>,regCustom)</code> adds <code>+</code> behind every character surrounded by <code>~</code> (the inner <code>$replace()</code> is in the <code>replace</code> parameter and executed for each match)</dd>
<dt><code>$rand([output1],[output2],[output3],..)</code></dt> <dt><a name="func-rand"><code>$rand([output1],[output2],[output3],..)</code></a></dt>
<dd>Randomly chooses one of the outputs.</dd> <dd>Randomly chooses one of the outputs.</dd>
<dd><em>Example:</em> <code>$rand(cheesecake,strawberry cake,$1-)</code> <dd><em>Example:</em> <code>$rand(cheesecake,strawberry cake,$1-)</code>
with <code>1-</code> referring to <code>apple pie</code> turns into with <code>1-</code> referring to <code>apple pie</code> turns into
either <code>cheesecake</code>, <code>strawberry cake</code> or either <code>cheesecake</code>, <code>strawberry cake</code> or
<code>apple pie</code>.</dd> <code>apple pie</code>.</dd>
<dt><code>$randnum(&lt;from&gt;,&lt;to&gt;)</code> or <code>$randnum(&lt;to&gt;)</code></dt> <dt><a name="func-randnum"><code>$randnum(&lt;from&gt;,&lt;to&gt;)</code> or <code>$randnum(&lt;to&gt;)</code></a></dt>
<dd>Randomly chooses a number in the given range (inclusive). If only <dd>Randomly chooses a number in the given range (inclusive). If only
one number is given, it the range is 0 to the given number. If the one number is given, it the range is 0 to the given number. If the
"from" is not a number, it defaults to 0, if the "to" is not a "from" is not a number, it defaults to 0, if the "to" is not a
@ -529,7 +564,7 @@
<dd><em>Example:</em> <code>$randum($$1)</code> chooses a random number <dd><em>Example:</em> <code>$randum($$1)</code> chooses a random number
between 0 and what is the first parameter.</dd> between 0 and what is the first parameter.</dd>
<dt><code>$calc(&lt;simple math expression&gt;)</code></dt> <dt><a name="func-calc"><code>$calc(&lt;simple math expression&gt;)</code></a></dt>
<dd>Limited support for performing calculations, with binary operators <dd>Limited support for performing calculations, with binary operators
(<code>* / % + -</code>) and functions (<code>sqrt() sin() cos() tan()</code>).</dd> (<code>* / % + -</code>) and functions (<code>sqrt() sin() cos() tan()</code>).</dd>
<dd><em>Example:</em> <code>//echo $calc(2^3) $calc( (3+4\) / 2)</code> <dd><em>Example:</em> <code>//echo $calc(2^3) $calc( (3+4\) / 2)</code>
@ -540,7 +575,7 @@
(this uses <code>$" "</code> to specify <a href="#escaping">literal text</a> (this uses <code>$" "</code> to specify <a href="#escaping">literal text</a>
instead of escaping the parenthesis with a backslash).</dd> instead of escaping the parenthesis with a backslash).</dd>
<dt><code>$round(&lt;number&gt;,[numDecimalPlaces],[roundingMode],[minNumDecimalPlaces])</code></dt> <dt><a name="func-round"><code>$round(&lt;number&gt;,[numDecimalPlaces],[roundingMode],[minNumDecimalPlaces])</code></a></dt>
<dd>Round a number to the given amount of decimal places, <dd>Round a number to the given amount of decimal places,
with a <a href="https://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html">rounding mode</a> with a <a href="https://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html">rounding mode</a>
of empty (half-up), <code>ceil</code>, <code>floor</code>, of empty (half-up), <code>ceil</code>, <code>floor</code>,
@ -551,13 +586,13 @@
<dd><em>Example:</em> <code>//echo $round(345.5,3,floor,3)</code> outputs <code>345.500</code> (fills up to 3 decimal places)</dd> <dd><em>Example:</em> <code>//echo $round(345.5,3,floor,3)</code> outputs <code>345.500</code> (fills up to 3 decimal places)</dd>
<dd><em>Example:</em> <code>//echo $round(2.565,2,,2)</code> outputs <code>2.57</code> (uses default rounding mode)</dd> <dd><em>Example:</em> <code>//echo $round(2.565,2,,2)</code> outputs <code>2.57</code> (uses default rounding mode)</dd>
<dt><code>$urlencode(&lt;input&gt;)</code></dt> <dt><a name="func-urlencode"><code>$urlencode(&lt;input&gt;)</code></a></dt>
<dd>Uses <a href="https://docs.oracle.com/javase/8/docs/api/java/net/URLEncoder.html#encode-java.lang.String-java.lang.String-">UrlEncoder.encode()</a> <dd>Uses <a href="https://docs.oracle.com/javase/8/docs/api/java/net/URLEncoder.html#encode-java.lang.String-java.lang.String-">UrlEncoder.encode()</a>
to prepare the input to be used in a URL query parameter.</dd> to prepare the input to be used in a URL query parameter.</dd>
<dd><em>Example:</em> <code>$urlencode($(msg))</code> in User Dialog <dd><em>Example:</em> <code>$urlencode($(msg))</code> in User Dialog
encodes the currently selected message.</dd> encodes the currently selected message.</dd>
<dt><code>$sort(&lt;input&gt;,[type],[separator])</code></dt> <dt><a name="func-sort"><code>$sort(&lt;input&gt;,[type],[separator])</code></a></dt>
<dd>Sorts the given input alphabetically. The sort type can be "abc" <dd>Sorts the given input alphabetically. The sort type can be "abc"
(default) for case-insensitive sorting or "Abc" for case-sensitive (default) for case-insensitive sorting or "Abc" for case-sensitive
sorting. The separator is what separates the parts that are sorted, sorting. The separator is what separates the parts that are sorted,
@ -565,18 +600,19 @@
<dd><em>Example:</em> <code>$sort(B c a)</code> turns into <code>a B c</code></dd> <dd><em>Example:</em> <code>$sort(B c a)</code> turns into <code>a B c</code></dd>
<dd><em>Example:</em> <code>$sort(B c a,Abc)</code> turns into <code>B a c</code></dd> <dd><em>Example:</em> <code>$sort(B c a,Abc)</code> turns into <code>B a c</code></dd>
<dt><code>$input([message],[intial],[type])</code></dt> <dt><a name="func-input"><code>$input([message],[intial],[type])</code></a></dt>
<dd>Requests text input from the user by showing an input dialog. <dd>Requests text input from the user by showing an input dialog.
Execution is paused while the dialog is open. The user may enter an Execution is paused while the dialog is open. The user may enter an
empty value (the result is just empty) or cancel the dialog (the empty value (the result is just empty) or cancel the dialog (the
command will not be executed).</dd> command will not be executed).</dd>
<dd>The <code>message</code> is shown in the input dialog, the <code>initial</code> <dd>The <code>message</code> is shown in the input dialog, the <code>initial</code>
text will already be in the input field when the dialog opens. The text will already be in the input field when the dialog opens. The
<code>type</code> is currently not used and can just be left empty.</dd> <code>type</code> can be set to <code>simple</code> to use the
previously default simple input dialog.</dd>
<dd><em>Example:</em> <code>$input()</code></dd> <dd><em>Example:</em> <code>$input()</code></dd>
<dd><em>Example:</em> <code>$input(Enter a number please)</code></dd> <dd><em>Example:</em> <code>$input(Enter a number please)</code></dd>
<dt><code>$datetime([format],[timezone],[locale],[unix time])</code></dt> <dt><a name="func-datetime"><code>$datetime([format],[timezone],[locale],[unix time])</code></a></dt>
<dd>Outputs the current date/time. You can optionally give a format <dd>Outputs the current date/time. You can optionally give a format
pattern (based on <a href="https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns">DateTimeFormatter</a>), pattern (based on <a href="https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns">DateTimeFormatter</a>),
a timezone (based on <a href="https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html">ZoneId</a>, a timezone (based on <a href="https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html">ZoneId</a>,
@ -634,12 +670,98 @@
<dd>(Preset format, with timezone, no locale, with a time <dd>(Preset format, with timezone, no locale, with a time
specified in milliseconds since 1970-01-01 00:00:00 UTC.)</dd> specified in milliseconds since 1970-01-01 00:00:00 UTC.)</dd>
</dl> </dl>
</dd>
<dt><a name="func-json"><code>$json(&lt;input&gt;,&lt;output&gt;)</code></a></dt>
<dd>Parse the JSON in <code>&lt;input&gt;</code> and use in <code>&lt;output&gt;</code>,
where <code>$j(&lt;path&gt;,[default])</code> can be used to access specific values.
The JSON input could e.g. come from the <code>$request()</code>
function.</dd>
<dd>If the path isn't formatted correctly or the JSON is invalid the
command may not work. Check out the Debug Log (e.g. Extra - Debug
window) to find out what went wrong.</dd>
<dd>The <code>&lt;path&gt;</code> specifies what value to return from
the <code>$j(&lt;path&gt;,[default])</code> function, whereas the optional <code>[default]</code>
value will be returned if the path is not valid or points to an empty value.</dd>
<dd>In the <code>&lt;path&gt;</code> you specify keys of JSON objects
separated by <code>-></code> (e.g. <code>key1->key2->key3</code>) or
indices of JSON arrays in brackets <code>[ ]</code> (e.g. <code>key1[0]</code>
for the first element of the array key1). Additionally the brackets <code>[ ]</code>
can contain:
<ul>
<li><code>last</code> for the last entry of an array</li>
<li><code>size</code> to return the number of elements</li>
<li><code>filter:&lt;path&gt;[=regex]</code> to select only
certain array items based on whether a path exists or if a
regex is provided the value of the path</li>
<li><code>collect:&lt;path&gt;[=regex]</code> iterates over an
array and for each element resolves the path and combines
the resulting values into an array</li>
<li><code>combine:&lt;path&gt;[=regex]</code> iterates over an
array and for each element resolves the path and for each
resulting value that is an array adds all of the array
values into a single result array</li>
<li><code>unique</code> removes duplicate elements from an array</li>
<li><code>join[:delimiter]</code> turns an array into a string
by joining all elements together using the given delimiter
(or "<code>, </code>" if none is provided)</li>
</ul></dd>
<dd><em>Examples</em> with the following JSON as input:
<pre>
{
"books":[
{"title":"book1", "author":"author1", "tags":["tag1","tag2"]},
{"title":"book2", "author":"author2", "tags":["tag1"]},
{"title":"book3", "author":"author2", "tags":["tag1", "tag3"]},
{"title":"book4", "author":"author2"}
],
"numBooks": 4,
"numAuthors": 2
}</pre>
<dl>
<dt><code>$json($get(var,j),There are $j(numBooks) books of $j(numAuthors) authors.)</code></dt>
<dt><code>$json($get(var,j),There are $j(books[size]) books of $j(books->[collect:author][unique][size]) authors.)</code></dt>
<dd><code>There are 4 books of 2 authors.</code></dd>
<dd>Reading the "num" values provided in the JSON or determining
the same information from the "books" array.</dd>
<dt><code>$json($get(var,j),The last book is called $j(books[last]->title) by $j(books[last]->author).)</code></dt>
<dd><code>The last book is called book4 by author2.</code></dd>
<dt><code>$json($get(var,j),The first book is $j(books[0]))</code></dt>
<dd><code>The first book is {"author":"author1","title":"book1","tags":["tag1","tag2"]}</code></dd>
<dd>If the end of the specified path is a JSONArray or JSONObject
it will be returned as a JSON encoded String.</dd>
<dt><code>$json($get(var,j),$j(books[10]->title,Book not found))</code></dt>
<dd><code>Book not found</code></dd>
<dd>Since the index <code>10</code> does not exist, the default
value <code>Book not found</code> is returned. If no default
value is provided an empty string would be returned.</dd>
<dt><code>$json($get(var,j),Books of author2: $j(books[filter:author=author2][collect:title]))</code></dt>
<dd><code>Books of author2: ["book2","book3","book4"]</code></dd>
<dt><code>$json($get(var,j),Tags of author2: $j(books[filter:author=author2][combine:tags][unique]))</code></dt>
<dd><code>Tags of author2: ["tag1","tag3"]</code></dd>
<dt><code>$json($get(var,j),Tags of author2: $j(books[filter:author=author2][combine:tags][unique][join]))</code></dt>
<dd><code>Tags of author2: tag1, tag3</code></dd>
</dl>
You can test these examples yourself if you store the JSON in the
variable "j" using the command <code>/set var j copyJSONfromabove</code>
and then use the <code>//echo $json($get(var,j),...)</code> command
in the chat inputbox
to output an info message with the result in chat. Pasting the JSON
directly into the <code>$json()</code> function would require
escaping the <code>,</code> characters to work.
</dd>
</dl> </dl>
<p>The following functions are only available in some contexts:</p> <p>The following functions are only available in some contexts:</p>
<dl class="defList"> <dl class="defList">
<dt><code>$is(&lt;match input&gt;)</code></dt> <dt><a name="func-is"><code>$is(&lt;match input&gt;)</code></a></dt>
<dd>Outputs <code>true</code> if the match succeeds, nothing otherwise. <dd>Outputs <code>true</code> if the match succeeds, nothing otherwise.
The <code>match input</code> is in the <a href="help-settings.html#Highlight_Matching">Highlight</a> The <code>match input</code> is in the <a href="help-settings.html#Highlight_Matching">Highlight</a>
format, although what can actually be matched against depends on format, although what can actually be matched against depends on
@ -649,7 +771,7 @@
will output <code>I'm a mod</code> in channels where you are the will output <code>I'm a mod</code> in channels where you are the
broadcaster or a moderator, <code>Not a mod</code> otherwise.</dd> broadcaster or a moderator, <code>Not a mod</code> otherwise.</dd>
<dt><code>$get(&lt;settingName&gt;,[key])</code></dt> <dt><a name="func-get"><code>$get(&lt;settingName&gt;,[key])</code></a></dt>
<dd>Returns the value of a setting. Different setting types return <dd>Returns the value of a setting. Different setting types return
differently formatted values. There is no comprehensive list of differently formatted values. There is no comprehensive list of
settings, unless you count the <a href="https://github.com/chatty/chatty/blob/master/src/chatty/SettingsManager.java">Chatty source</a>.</dd> settings, unless you count the <a href="https://github.com/chatty/chatty/blob/master/src/chatty/SettingsManager.java">Chatty source</a>.</dd>
@ -662,7 +784,7 @@
<dd><em>Example:</em> <code>$if($get(ontop),ONTOP)</code> will return <dd><em>Example:</em> <code>$if($get(ontop),ONTOP)</code> will return
<code>ONTOP</code> only if "View - Always on top" is enabled.</dd> <code>ONTOP</code> only if "View - Always on top" is enabled.</dd>
<dt><code>$request(&lt;url&gt;,[options])</code></dt> <dt><a name="func-request"><code>$request(&lt;url&gt;,[options])</code></a></dt>
<dd>Performs a GET request on the given http/https URL and returns the <dd>Performs a GET request on the given http/https URL and returns the
body of the reponse interpreted as UTF-8 encoded text. If an error body of the reponse interpreted as UTF-8 encoded text. If an error
occurs the response will be empty.</dd> occurs the response will be empty.</dd>
@ -670,6 +792,11 @@
<ul> <ul>
<li><code>error</code> - A request error will return an error <li><code>error</code> - A request error will return an error
message instead of an empty response.</li> message instead of an empty response.</li>
<li><code>trim</code> - Remove leading and trailing space from
the request result. This may be useful if a request returns
any spaces or linebreak characters that cause issues with
what you're using it with. Same as the <a href="#func-trim"><code>$trim()</code></a>
function.</li>
</ul></dd> </ul></dd>
<dd><em>Note:</em> Normally Custom Commands are performed instantaneously, however the <dd><em>Note:</em> Normally Custom Commands are performed instantaneously, however the
replacements for any Custom Command that contains the <code>$request()</code> replacements for any Custom Command that contains the <code>$request()</code>

View File

@ -17,6 +17,7 @@
<h1><a name="top">Release Information</a></h1> <h1><a name="top">Release Information</a></h1>
<p> <p>
<a href="#0.22">0.22</a> |
<a href="#0.21">0.21</a> | <a href="#0.21">0.21</a> |
<a href="#0.20">0.20</a> | <a href="#0.20">0.20</a> |
<a href="#0.19">0.19</a> | <a href="#0.19">0.19</a> |
@ -70,10 +71,52 @@
full list of changes.</p> full list of changes.</p>
<h2> <h2>
<a name="0.21">Version 0.21</a> <a name="latest">(This one!)</a> (2022-10-17) <a name="0.22">Version 0.22</a> <a name="latest">(This one!)</a> (2023-01-15)
<a href="#top" class="top">[back to top]</a> <a href="#top" class="top">[back to top]</a>
</h2> </h2>
<p>Twitch has announced that Twich chat comands will be removed from IRC in <pre>
### Twitch Features
- Added chat message for outgoing raids with join link (due to API limits only
in at most 10 live channels)
- Show poll start/end messages (broadcaster only)
- Added shield mode commands and display (for moderators)
### Custom Commands
- Added "Anonymous Custom Command" hotkey action, where a Custom Command can be
entered directly (instead of a the name of a Custom Command)
- Added function `$trim()` to remove leading and trailing whitespace
- Added `trim` option to `$request()`
- Added function `$json()` to parse JSON and access specific values
- Changed `$input()` inputbox to have the same features as the channel inputbox
if run in a channel context
- Added `/exportText` options `-A` and `-L`
### Other
- Added FlatLaf (new modern Look&Feel, selectable in the "Look" settings)
- Added feature to make a popout with one channel transparent
- Made AutoMod dialog dockable
- Improved Settings Dialog
- Removed SRL menu
- Removed some hosting related stuff, added raid context menu entries
- Added setting whether to hide tab pane when only a single channel is open
(hidden by default, as was the previous behaviour)
- Added local caching to Pronouns for more reliability and faster display
- Added new Chatty icons to img folder
- Added context menu setting to Live Streams list to only show favorites
- Updated help
### Bugfixes
- Fixed `/color` command not being able to set some default colors
- Fixed error occuring for some commands when no parameter is provided
- Fixed commands `/unvip` and `/unmod`
- Fixed channels sometimes not opening in the correct popout
</pre>
<h2>
<a name="0.21">Version 0.21</a> (2022-10-17)
<a href="#top" class="top">[back to top]</a>
</h2>
<p>Twitch has announced that Twitch chat comands will be removed from IRC in
February 2023, so they need to be migrated to the API. You will need to February 2023, so they need to be migrated to the API. You will need to
update your login with additional access scopes to be able to use most update your login with additional access scopes to be able to use most
commands in this update.</p> commands in this update.</p>

View File

@ -1376,10 +1376,6 @@
<dt><code>user:name chan:tirean,gocnak</code></dt> <dt><code>user:name chan:tirean,gocnak</code></dt>
<dd>Ignores the user with the name <code>name</code> in channels <code>#tirean</code> and <code>#gocnak</code></dd> <dd>Ignores the user with the name <code>name</code> in channels <code>#tirean</code> and <code>#gocnak</code></dd>
<dt><code>config:info subscribed to</code></dt>
<dd>Ignores the <code>x has subscribed to y</code> info messages that
you get when someone subscribes in the channel that is being hosted</dd>
<dt><code>cat:ignore !chan:lotsofs,joshimuz</code></dt> <dt><code>cat:ignore !chan:lotsofs,joshimuz</code></dt>
<dd>Ignores users in the addressbook category <code>ignore</code> in all channels, <dd>Ignores users in the addressbook category <code>ignore</code> in all channels,
except <code>#lotsofs</code> and <code>#joshimuz</code></dd> except <code>#lotsofs</code> and <code>#joshimuz</code></dd>
@ -1920,20 +1916,6 @@
<h3>Other</h3> <h3>Other</h3>
<dl class="dl-settings"> <dl class="dl-settings">
<dt>Auto-Unhost when your stream goes live</dt>
<dd>Automatically
sends the <code>/unhost</code> command to your channel if you started
your stream session in the last 15 minutes and the stream status
changes (usually from offline -> live).<br />
For this to work, you need to have joined the channel in Chatty,
either with the broadcaster account (so your own account if it's
your stream) or with an account that is an editor in the channel
(in which case you also have to add the channel to the
<code>autoUnhostStreams</code> setting, via
<code>/add autoUnhostStreams &lt;streamName&gt;</code>, in order to
tell Chatty that you are authorized/want to use the automatic <code>/unhost</code>
feature in that channel).</dd>
<dt>Prepend to window title</dt> <dt>Prepend to window title</dt>
<dd>Add some arbitrary text to the beginning of the window title. This <dd>Add some arbitrary text to the beginning of the window title. This
can be useful if you run several instances of Chatty (to be able to can be useful if you run several instances of Chatty (to be able to

View File

@ -5,7 +5,7 @@
<link rel="stylesheet" type="text/css" href="style.css" /> <link rel="stylesheet" type="text/css" href="style.css" />
</head> </head>
<body> <body>
<h1><a name="top">Chatty (Version: 0.21)</a></h1> <h1><a name="top">Chatty (Version: 0.22)</a></h1>
<table> <table>
<tr> <tr>
<td valign="top"> <td valign="top">
@ -117,11 +117,11 @@
<p>In addition, the titlebar will also show additional information, if enabled:</p> <p>In addition, the titlebar will also show additional information, if enabled:</p>
<ul> <ul>
<li>The name of the channel that is being hosted</li>
<li><code>Sub</code> for Subscriber-Only Mode</li> <li><code>Sub</code> for Subscriber-Only Mode</li>
<li><code>Slow: &lt;time&gt;</code> for Slowmode</li> <li><code>Slow: &lt;time&gt;</code> for Slowmode</li>
<li><code>R9k</code> for R9Kbeta Mode</li> <li><code>R9k</code> for R9Kbeta Mode</li>
<li><code>EmoteOnly</code> for Emote-Only Mode</li> <li><code>EmoteOnly</code> for Emote-Only Mode</li>
<li><code>Shield</code> if Shield Mode is enabled (moderators only)</li>
<li>A language code if Broadcaster Language Mode is enabled</li> <li>A language code if Broadcaster Language Mode is enabled</li>
<li><code>[FM]</code> indicates a websocket connection (<code>F</code> <li><code>[FM]</code> indicates a websocket connection (<code>F</code>
for FrankerFaceZ, <code>M</code> for PubSub/Modlogs)</li> for FrankerFaceZ, <code>M</code> for PubSub/Modlogs)</li>
@ -269,12 +269,12 @@
<li><code>/timeout</code>, <code>/ban</code>, <code>/unban</code>, <li><code>/timeout</code>, <code>/ban</code>, <code>/unban</code>,
<code>/slow</code>, <code>/slowoff</code>, <code>/slow</code>, <code>/slowoff</code>,
<code>/subscribers</code>, <code>/subscribersoff</code>, <code>/subscribers</code>, <code>/subscribersoff</code>,
<code>/clear</code>, <code>/mods</code>, <code>/host</code>, <code>/shieldMode</code>, <code>/shieldModeOff</code>,
<code>/unhost</code>, <code>/raid</code>, <code>/unraid</code>, <code>/clear</code>, <code>/mods</code>,
<code>/raid</code>, <code>/unraid</code>,
<code>/color</code> <code>/color</code>
just like in normal Twitch Chat</li> just like in normal Twitch Chat</li>
<li><code>/join &lt;channel&gt;</code> - Joins the given channels, see <a href="#join">Joining Channels</a> for more information</li> <li><code>/join &lt;channel&gt;</code> - Joins the given channels, see <a href="#join">Joining Channels</a> for more information</li>
<li><code>/joinhosted</code> - Join currently hosted channel (if any)</li>
<li><code>/part</code> or <code>/close</code> - Leaves the current channel</li> <li><code>/part</code> or <code>/close</code> - Leaves the current channel</li>
<li><code>/rejoin</code> - Rejoins the channel (without clearing users or chat)</li> <li><code>/rejoin</code> - Rejoins the channel (without clearing users or chat)</li>
<li><code>/reconnect</code> - Disconnects and reconnects</li> <li><code>/reconnect</code> - Disconnects and reconnects</li>
@ -360,7 +360,15 @@
<li><code>/showJavaDir</code> / <code>/openJavaDir</code> - Show/open the directory of the JRE used by Chatty</li> <li><code>/showJavaDir</code> / <code>/openJavaDir</code> - Show/open the directory of the JRE used by Chatty</li>
<li><code>/showFallbackFontDir</code> / <code>/openFallbackFontDir</code> - Show/open the directory where Java looks for <a href="help-troubleshooting.html#font">fallback fonts</a></li> <li><code>/showFallbackFontDir</code> / <code>/openFallbackFontDir</code> - Show/open the directory where Java looks for <a href="help-troubleshooting.html#font">fallback fonts</a></li>
<li><code>/showTempDir</code> / <code>/openTempDir</code> - Show/open the system's temp directory</li> <li><code>/showTempDir</code> / <code>/openTempDir</code> - Show/open the system's temp directory</li>
<li><code>/exportText [-sna] &lt;fileName&gt; &lt;text&gt;</code> - Write the text to a file in the "exported" directory in the settings directory (UTF-8), <code>-s</code> for no info message when writing successfully, <code>-n</code> for replacing "\n" in the text with a newline, <code>-a</code> for appending to the file (Example: <code>/exportText -n abc.txt one\ntwo</code> - Writes "one" and "two" as separate lines)</li> <li><code>/exportText [-sna] &lt;fileName&gt; &lt;text&gt;</code> - Write the text to a file in the "exported" directory in the settings directory (UTF-8)
<ul>
<li><code>-s</code> - no info message when writing successfully</li>
<li><code>-n</code> - replace "\n" in the text with a newline</li>
<li><code>-a</code> - append to the file (instead of overwriting it)</li>
<li><code>-A</code> - append to the file and append a newline character</li>
<li><code>-L</code> - append to the file on a new line (prepend a newline character)</li>
</ul>
(Example: <code>/exportText -n abc.txt one\ntwo</code> - Writes "one" and "two" as separate lines)</li>
<li><code>/refresh &lt;emoticons/badges/ffz/ffzglobal/bttvemotes&gt;</code> <li><code>/refresh &lt;emoticons/badges/ffz/ffzglobal/bttvemotes&gt;</code>
- Refresh the given data from it's respective API: - Refresh the given data from it's respective API:
<ul> <ul>
@ -387,8 +395,7 @@
<li><code>/testNotification [channel]</code> - Display a test notification (optionally with channel, <li><code>/testNotification [channel]</code> - Display a test notification (optionally with channel,
which means right-clicking on the notification will join that channel)</li> which means right-clicking on the notification will join that channel)</li>
<li><code>/debug simulate &lt;type&gt;</code> - Simulates a chat message <li><code>/debug simulate &lt;type&gt;</code> - Simulates a chat message
for testing. Some possible types: <code>sub</code>, <code>resub</code>, for testing. See the Chatty source code for possible values.
<code>bits</code>, <code>authost</code>.
</li> </li>
<li><code>/debug</code> allows for a number of debug commands to be run, <li><code>/debug</code> allows for a number of debug commands to be run,
but those may produce errors and strange behaviour, so you usually but those may produce errors and strange behaviour, so you usually

View File

@ -1,11 +1,26 @@
body { body {
max-width: 700px; max-width: 700px;
font-size: 1em; font-size: 1em;
color: black;
background-color: #FDFDFD; background-color: #FDFDFD;
font-family: Arial, sans-serif; font-family: Arial, sans-serif;
padding: 10px; padding: 10px;
margin: 0; margin: 0;
} }
/**
The link color with some LaF might be wrong, so set it explicitly. However just
a:link and similar doesn't seem to work in Java, but targeting a changes the
color of all a tags, including <a name=""></a>, in normal browsers. So first set
everything with a "name" attribute to black for normal browsers (which would set
*all* of them to black in Java if it came second) and then set them to blue for
Java.
*/
a[name] {
color: black;
}
a {
color: blue;
}
h1 { h1 {
margin: 4px 0 5px 0; margin: 4px 0 5px 0;
font-size: 1.2em; font-size: 1.2em;
@ -41,6 +56,7 @@ li {
} }
code { code {
background-color: #EEEEEE; background-color: #EEEEEE;
font-size: 1em;
} }
.codeblock { .codeblock {

View File

@ -16,9 +16,9 @@ function loaded() {
{ ceiling: null, text: "$years years ago" } { ceiling: null, text: "$years years ago" }
] ]
} }
document.getElementById("ago").innerHTML = "Version 0.21 released "+humanized_time_span("2022/10/17", Date(), custom_date_formats)+""; document.getElementById("ago").innerHTML = "Version 0.22 released "+humanized_time_span("2023/01/15", Date(), custom_date_formats)+"";
getDownloads("v0.21"); getDownloads("v0.22");
slideshow_init("slideshow"); slideshow_init("slideshow");
} }
@ -158,7 +158,7 @@ function getDownloads(tag) {
<h2 id="download">Download</h2> <h2 id="download">Download</h2>
<p>Choose one of the following downloads of <strong>Chatty Version 0.21</strong><span id="dlCount" style="margin-bottom:7px;"></span>. For older versions or betas go to the <a href="https://github.com/chatty/chatty/releases">GitHub Releases</a>. Checksums for release files are available as <a href="https://tduva.com/chatty/checksums/v0.21/">SHA-256 hashes</a>.</p> <p>Choose one of the following downloads of <strong>Chatty Version 0.22</strong><span id="dlCount" style="margin-bottom:7px;"></span>. For older versions or betas go to the <a href="https://github.com/chatty/chatty/releases">GitHub Releases</a>. Checksums for release files are available as <a href="https://tduva.com/chatty/checksums/v0.22/">SHA-256 hashes</a>.</p>
<p>If this is your first time using Chatty check out the <a href="help/help-getting-started.html"><strong>Getting Started Guide</strong></a>.</p> <p>If this is your first time using Chatty check out the <a href="help/help-getting-started.html"><strong>Getting Started Guide</strong></a>.</p>
<h3>Windows</h3> <h3>Windows</h3>
@ -170,11 +170,11 @@ function getDownloads(tag) {
<tr> <tr>
<td> <td>
<dl> <dl>
<dt><a href="https://github.com/chatty/chatty/releases/download/v0.21/Chatty_0.21_win_standalone_setup.exe"><strong>Download Windows Standalone (Installer)</strong></a> <span class="recommended"><sup>Recommended</sup></span></dt> <dt><a href="https://github.com/chatty/chatty/releases/download/v0.22/Chatty_0.22_win_standalone_setup.exe"><strong>Download Windows Standalone (Installer)</strong></a> <span class="recommended"><sup>Recommended</sup></span></dt>
<dd>Install into a folder of your choice and start <code>Chatty.exe</code> (or optionally created shortcuts).</dd> <dd>Install into a folder of your choice and start <code>Chatty.exe</code> (or optionally created shortcuts).</dd>
</dl> </dl>
<dl> <dl>
<dt><a href="https://github.com/chatty/chatty/releases/download/v0.21/Chatty_0.21_win_standalone.zip">Download Windows Standalone (.zip)</a></dt> <dt><a href="https://github.com/chatty/chatty/releases/download/v0.22/Chatty_0.22_win_standalone.zip">Download Windows Standalone (.zip)</a></dt>
<dd>Extract the .zip into a folder of your choice and start <code>Chatty.exe</code>.</dd> <dd>Extract the .zip into a folder of your choice and start <code>Chatty.exe</code>.</dd>
</dl> </dl>
@ -182,11 +182,11 @@ function getDownloads(tag) {
</td> </td>
<td> <td>
<dl> <dl>
<dt><a href="https://github.com/chatty/chatty/releases/download/v0.21/Chatty_0.21_win_setup.exe">Download JAR-Version (Installer)</a></dt> <dt><a href="https://github.com/chatty/chatty/releases/download/v0.22/Chatty_0.22_win_setup.exe">Download JAR-Version (Installer)</a></dt>
<dd>Install into a folder of your choice and start <code>Chatty.jar</code> (or optionally created shortcuts).</dd> <dd>Install into a folder of your choice and start <code>Chatty.jar</code> (or optionally created shortcuts).</dd>
</dl> </dl>
<dl> <dl>
<dt><a href="https://github.com/chatty/chatty/releases/download/v0.21/Chatty_0.21.zip">Download JAR-Version (.zip)</a></dt> <dt><a href="https://github.com/chatty/chatty/releases/download/v0.22/Chatty_0.22.zip">Download JAR-Version (.zip)</a></dt>
<dd>Extract the .zip into a folder of your choice and start <code>Chatty.jar</code>.</dd> <dd>Extract the .zip into a folder of your choice and start <code>Chatty.jar</code>.</dd>
</dl> </dl>
</td> </td>
@ -194,7 +194,7 @@ function getDownloads(tag) {
</table> </table>
<h3>Non-Windows</h3> <h3>Non-Windows</h3>
<p>For OS other than Windows (e.g. Linux or MacOS) you will need to download the <a href="https://github.com/chatty/chatty/releases/download/v0.21/Chatty_0.21.zip">JAR-Version (.zip)</a> and must have Java 8 or later installed on your system. Extract the .zip into a folder of your choice and start <code>Chatty.jar</code>.</p> <p>For OS other than Windows (e.g. Linux or MacOS) you will need to download the <a href="https://github.com/chatty/chatty/releases/download/v0.22/Chatty_0.22.zip">JAR-Version (.zip)</a> and must have Java 8 or later installed on your system. Extract the .zip into a folder of your choice and start <code>Chatty.jar</code>.</p>
<h2 id="feedback">Contact</h2> <h2 id="feedback">Contact</h2>
<p>If you have any feedback or questions feel free to contact me. You can <a href="https://discord.gg/WTuqGeJ">join the Chatty Discord</a> <sup>preferred</sup>, write me an <a href="mailto:chattyclient@gmail.com">E-Mail</a> or use <a href="https://twitter.com/chattyclient">Twitter</a>.</p> <p>If you have any feedback or questions feel free to contact me. You can <a href="https://discord.gg/WTuqGeJ">join the Chatty Discord</a> <sup>preferred</sup>, write me an <a href="mailto:chattyclient@gmail.com">E-Mail</a> or use <a href="https://twitter.com/chattyclient">Twitter</a>.</p>