<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://montoyo.net/wdwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Montoyo</id>
		<title>WebDisplays - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://montoyo.net/wdwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Montoyo"/>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Special:Contributions/Montoyo"/>
		<updated>2026-04-27T12:50:57Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Mine_Pad&amp;diff=212</id>
		<title>Mine Pad</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Mine_Pad&amp;diff=212"/>
				<updated>2023-09-09T02:21:40Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: Redirected page to MinePad&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[MinePad]]&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Linux&amp;diff=211</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Linux&amp;diff=211"/>
				<updated>2019-10-19T14:19:22Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: Created page with &amp;quot;TODO&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=210</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=210"/>
				<updated>2019-07-25T20:32:52Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Downloading &amp;amp; installing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#widget:WDCube}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Welcome to the WebDisplays wiki!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you can find all kind of informations about the WebDisplays mod blocks &amp;amp; items, as well as the documentation for some JavaScript functions. If you're in the game, you can also hover a WebDisplays item and press F1 to open the corresponding wiki page using the internal web browser!&lt;br /&gt;
&lt;br /&gt;
Hope you're having fun with the mod, - montoyo.&lt;br /&gt;
&lt;br /&gt;
==Quick start==&lt;br /&gt;
To get into the mod, you probably want to check out the [[Screen]] page :p&lt;br /&gt;
&lt;br /&gt;
==Downloading &amp;amp; installing==&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.10.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 12.18.3.2185 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 0.9 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.12.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 14.23.5.2768 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 1.11 or later&lt;br /&gt;
* (Optional) [https://www.curseforge.com/minecraft/mc-mods/opencomputers/files OpenComputers]&lt;br /&gt;
* (Optional) [https://www.curseforge.com/minecraft/mc-mods/computercraft/files ComputerCraft]&lt;br /&gt;
&lt;br /&gt;
===Download link===&lt;br /&gt;
Hit the button below to access the download page:&lt;br /&gt;
[[File:Download.png|center|link=https://montoyo.net/wd3/?modid=webdisplays|Click here to download the mod]]&lt;br /&gt;
&lt;br /&gt;
==Mod License==&lt;br /&gt;
Even though the source code is public, the following license applies:&lt;br /&gt;
&lt;br /&gt;
This software, its source code and its binaries are Copyright © 2018 Nicolas BARBOTIN and are the intellectual property of the author.&lt;br /&gt;
It may be not be reproduced under any circumstances except for personal, private use as long as it remains in its unaltered, unedited form.&lt;br /&gt;
It may not be placed on any web site or otherwise distributed publicly without advance written permission.&lt;br /&gt;
Use of this software on any other website or as a part of any public display is strictly prohibited, and a violation of copyright.&lt;br /&gt;
&lt;br /&gt;
==Bugs==&lt;br /&gt;
===Screen stays white===&lt;br /&gt;
This is likely an MCEF bug. If you are on Linux or Mac, this is to be expected. WebDisplays &amp;amp; MCEF are not yet available on these platforms; don't report a bug.&lt;br /&gt;
If you think this is a legitimate bug, you can post on issue on the [https://github.com/montoyo/mcef/issues MCEF bug tracker], but don't forget to follow the rules stated in [[#Other bugs]]!&lt;br /&gt;
&lt;br /&gt;
===Other bugs===&lt;br /&gt;
If you'd like to report a bug, go on the project's [https://github.com/montoyo/webdisplays/issues GitHub bug tracker], and follow these rules:&lt;br /&gt;
* Make sure you're using WebDisplays 1.0 (for MC 1.10.2 or 1.12.2) or later. Previous versions aren't supported anymore.&lt;br /&gt;
* Make sure your issue doesn't already exist&lt;br /&gt;
* In the title, add the Minecraft AND mod versions&lt;br /&gt;
* Tell me how to reproduce the bug&lt;br /&gt;
* Send me your log (&amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;). To do this please use pastebin (or any pastebin clone)&lt;br /&gt;
&lt;br /&gt;
If you ignore any of these rules I won't be able to fix the bug!&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Flash?===&lt;br /&gt;
No. You shouldn't be using Flash anyway, it has some serious security issues...&lt;br /&gt;
&lt;br /&gt;
===Chrome extensions?===&lt;br /&gt;
WebDisplays is using MCEF, which uses JCEF, which in turn uses CEF. Unfortunately, the Chromium Embedded Framework does not support extesions.&lt;br /&gt;
&lt;br /&gt;
===ALL MY SCREENS ARE WHITE===&lt;br /&gt;
This is not a WebDisplays bug, but rather a MCEF bug. Check the [[#Screen stays white]] section for more informations.&lt;br /&gt;
&lt;br /&gt;
===Where are my log files?===&lt;br /&gt;
On Windows, if you didn't change the Minecraft location, open the file explorer and in the location field type &amp;lt;code&amp;gt;%appdata%\.minecraft\logs&amp;lt;/code&amp;gt;. The file you are looking for is &amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;. &amp;lt;strong&amp;gt;NEVER&amp;lt;/strong&amp;gt; copy paste it in a message but rather upload it on [https://pastebin.com pastebin] and then paste the link in the message.&lt;br /&gt;
&lt;br /&gt;
===How can I change the home page?===&lt;br /&gt;
By editing the configuration file located in the .minecraft\config directory. Open webdisplays.cfg and change the value on the line that starts with &amp;quot;S:homepage=&amp;quot;. I know this is a bit complicated and I'll probably change this in a future WebDisplays version.&lt;br /&gt;
&lt;br /&gt;
===I want to put your mod in a modpack===&lt;br /&gt;
If your modpack will be distributed to less than 10 people, go on. For 10 people or more, contact me using the e-mail address on my [https://github.com/montoyo/ GitHub profile].&lt;br /&gt;
&lt;br /&gt;
===Linux?===&lt;br /&gt;
I'll try to port MCEF for Linux.&lt;br /&gt;
&lt;br /&gt;
===Mac?===&lt;br /&gt;
Buy me a Mac first.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=209</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=209"/>
				<updated>2019-07-25T20:32:23Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#widget:WDCube}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Welcome to the WebDisplays wiki!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you can find all kind of informations about the WebDisplays mod blocks &amp;amp; items, as well as the documentation for some JavaScript functions. If you're in the game, you can also hover a WebDisplays item and press F1 to open the corresponding wiki page using the internal web browser!&lt;br /&gt;
&lt;br /&gt;
Hope you're having fun with the mod, - montoyo.&lt;br /&gt;
&lt;br /&gt;
==Quick start==&lt;br /&gt;
To get into the mod, you probably want to check out the [[Screen]] page :p&lt;br /&gt;
&lt;br /&gt;
==Downloading &amp;amp; installing==&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.10.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 12.18.3.2185 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 0.9 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.12.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 14.23.5.2768 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 1.11 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
* (Optional) [https://www.curseforge.com/minecraft/mc-mods/computercraft/files ComputerCraft]&lt;br /&gt;
&lt;br /&gt;
===Download link===&lt;br /&gt;
Hit the button below to access the download page:&lt;br /&gt;
[[File:Download.png|center|link=https://montoyo.net/wd3/?modid=webdisplays|Click here to download the mod]]&lt;br /&gt;
&lt;br /&gt;
==Mod License==&lt;br /&gt;
Even though the source code is public, the following license applies:&lt;br /&gt;
&lt;br /&gt;
This software, its source code and its binaries are Copyright © 2018 Nicolas BARBOTIN and are the intellectual property of the author.&lt;br /&gt;
It may be not be reproduced under any circumstances except for personal, private use as long as it remains in its unaltered, unedited form.&lt;br /&gt;
It may not be placed on any web site or otherwise distributed publicly without advance written permission.&lt;br /&gt;
Use of this software on any other website or as a part of any public display is strictly prohibited, and a violation of copyright.&lt;br /&gt;
&lt;br /&gt;
==Bugs==&lt;br /&gt;
===Screen stays white===&lt;br /&gt;
This is likely an MCEF bug. If you are on Linux or Mac, this is to be expected. WebDisplays &amp;amp; MCEF are not yet available on these platforms; don't report a bug.&lt;br /&gt;
If you think this is a legitimate bug, you can post on issue on the [https://github.com/montoyo/mcef/issues MCEF bug tracker], but don't forget to follow the rules stated in [[#Other bugs]]!&lt;br /&gt;
&lt;br /&gt;
===Other bugs===&lt;br /&gt;
If you'd like to report a bug, go on the project's [https://github.com/montoyo/webdisplays/issues GitHub bug tracker], and follow these rules:&lt;br /&gt;
* Make sure you're using WebDisplays 1.0 (for MC 1.10.2 or 1.12.2) or later. Previous versions aren't supported anymore.&lt;br /&gt;
* Make sure your issue doesn't already exist&lt;br /&gt;
* In the title, add the Minecraft AND mod versions&lt;br /&gt;
* Tell me how to reproduce the bug&lt;br /&gt;
* Send me your log (&amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;). To do this please use pastebin (or any pastebin clone)&lt;br /&gt;
&lt;br /&gt;
If you ignore any of these rules I won't be able to fix the bug!&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Flash?===&lt;br /&gt;
No. You shouldn't be using Flash anyway, it has some serious security issues...&lt;br /&gt;
&lt;br /&gt;
===Chrome extensions?===&lt;br /&gt;
WebDisplays is using MCEF, which uses JCEF, which in turn uses CEF. Unfortunately, the Chromium Embedded Framework does not support extesions.&lt;br /&gt;
&lt;br /&gt;
===ALL MY SCREENS ARE WHITE===&lt;br /&gt;
This is not a WebDisplays bug, but rather a MCEF bug. Check the [[#Screen stays white]] section for more informations.&lt;br /&gt;
&lt;br /&gt;
===Where are my log files?===&lt;br /&gt;
On Windows, if you didn't change the Minecraft location, open the file explorer and in the location field type &amp;lt;code&amp;gt;%appdata%\.minecraft\logs&amp;lt;/code&amp;gt;. The file you are looking for is &amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;. &amp;lt;strong&amp;gt;NEVER&amp;lt;/strong&amp;gt; copy paste it in a message but rather upload it on [https://pastebin.com pastebin] and then paste the link in the message.&lt;br /&gt;
&lt;br /&gt;
===How can I change the home page?===&lt;br /&gt;
By editing the configuration file located in the .minecraft\config directory. Open webdisplays.cfg and change the value on the line that starts with &amp;quot;S:homepage=&amp;quot;. I know this is a bit complicated and I'll probably change this in a future WebDisplays version.&lt;br /&gt;
&lt;br /&gt;
===I want to put your mod in a modpack===&lt;br /&gt;
If your modpack will be distributed to less than 10 people, go on. For 10 people or more, contact me using the e-mail address on my [https://github.com/montoyo/ GitHub profile].&lt;br /&gt;
&lt;br /&gt;
===Linux?===&lt;br /&gt;
I'll try to port MCEF for Linux.&lt;br /&gt;
&lt;br /&gt;
===Mac?===&lt;br /&gt;
Buy me a Mac first.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=ComputerCraft_Interface&amp;diff=208</id>
		<title>ComputerCraft Interface</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=ComputerCraft_Interface&amp;diff=208"/>
				<updated>2019-07-24T12:02:26Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The ComputerCraft Interface is a [[Screen#Peripheral|peripheral]] which can be used by ComputerCraft computers to interact with screens through Lua.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Ccinterface.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the left is a [[Peripheral Base]], used to craft all peripherals.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
First, place the block next to a ComputerCraft computer and link it to a screen using the [[Linking Tool]]. Then, all you have to do is to call peripheral.wrap with the corresponding side.&lt;br /&gt;
So, if you placed the interface on the right of the computer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen = peripheral.wrap(&amp;quot;left&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Permissions==&lt;br /&gt;
This interface will have the same restrictions and permissions as the player who placed the block.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
Functions are the same as the [[OpenComputers Interface]] ones.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=File:Ccinterface.png&amp;diff=207</id>
		<title>File:Ccinterface.png</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=File:Ccinterface.png&amp;diff=207"/>
				<updated>2019-07-24T11:58:08Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=206</id>
		<title>OpenComputers Interface</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=206"/>
				<updated>2019-07-23T15:26:42Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The OpenComputers Interface is a [[Screen#Peripheral|peripheral]] which can be used by OpenComputers computers to interact with screens.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Ocinterface.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the left is a [[Peripheral Base]], used to craft all peripherals.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
First, place the block next to an OpenComputers computer and link it to a screen using the [[Linking Tool]]. Then, you'll need its OpenComputers address, which can be obtained this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
component = component or require(&amp;quot;component&amp;quot;)&lt;br /&gt;
wdScreenAddress = nil&lt;br /&gt;
&lt;br /&gt;
for addr, name in component.list() do&lt;br /&gt;
    if name == &amp;quot;webdisplays&amp;quot; then&lt;br /&gt;
        wdScreenAddress = addr&lt;br /&gt;
        break&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if not wdScreenAddress then&lt;br /&gt;
    print(&amp;quot;Couldn't find WebDisplays screen&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you'll need a proxy to execute WebDisplays functions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen = component.proxy(wdScreenAddress)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This process is detailed on the [http://ocdoc.cil.li/component:component_access OpenComputers wiki].&lt;br /&gt;
&lt;br /&gt;
==Permissions==&lt;br /&gt;
This interface will have the same restrictions and permissions as the player who placed the block.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Function name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return values&lt;br /&gt;
!Comment&lt;br /&gt;
!Permission&lt;br /&gt;
|-&lt;br /&gt;
|isLinked||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|isScreenChunkLoaded||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenPos||None||number, number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenSide||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|getOwner||None||string, string||Returns name &amp;amp; UUID||&lt;br /&gt;
|-&lt;br /&gt;
|can||string||bool||Checks for permission. Permission name can be found in the &amp;quot;permission&amp;quot; column.||&lt;br /&gt;
|-&lt;br /&gt;
|hasUpgrade||string||bool||Upgrade name is case insensitive||&lt;br /&gt;
|-&lt;br /&gt;
|getSize||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getResolution||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getRotation||None||number||In degrees||&lt;br /&gt;
|-&lt;br /&gt;
|getURL||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|click||number, number, string||bool||Arguments are x, y, action. Action can by click, up, or down. Rotation is handled internally.||click&lt;br /&gt;
|-&lt;br /&gt;
|type||string||bool||||click&lt;br /&gt;
|-&lt;br /&gt;
|typeAdvanced||string/table||bool||Manually control key up/down events. Arguments depend the on WebDisplays version.||click&lt;br /&gt;
|-&lt;br /&gt;
|setURL||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|setResolution||number, number||bool||||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|setRotation||number||bool||In degrees||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|runJS||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|unlink||None||None||Why would anyone do that?||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.1===&lt;br /&gt;
In WebDisplays 1.1, typeAdvanced requires a table. Each value within this table contains a keyboard event to send to the screen. This event is described using yet another table containing the following fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Field name&lt;br /&gt;
!Value type&lt;br /&gt;
!Value description&lt;br /&gt;
|-&lt;br /&gt;
|action||string||Can be &amp;quot;press&amp;quot;, &amp;quot;release&amp;quot;, or &amp;quot;type&amp;quot;. This is case insensitive.&lt;br /&gt;
|-&lt;br /&gt;
|code||number||The corresponding key code. Useless when action is &amp;quot;type&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|char||string||The character corresponding to that key.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that if you want to write something, &amp;quot;press&amp;quot; and &amp;quot;release&amp;quot; events are not enough. You '''need''' to send the corresponding &amp;quot;type&amp;quot; event. Press &amp;amp; release events are only required for control keys (backspace, return, tab, etc...). If you only want to type something, you should use the &amp;quot;type&amp;quot; function; it's a lot faster and also easier.&lt;br /&gt;
&lt;br /&gt;
For a list of key codes, check out [[Key codes]].&lt;br /&gt;
&lt;br /&gt;
Example code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen.typeAdvanced{&lt;br /&gt;
    { action = &amp;quot;press&amp;quot;  , code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;release&amp;quot;, code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;type&amp;quot;   , char = &amp;quot;r&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.0===&lt;br /&gt;
With WebDisplays 1.0, key events are stored in a string using the ASCII character 0x01 as separator. Each event must contain at least 2 characters. The first one is the event type ('p' for press, 'r' for release, and 't' for type), and the second is the pressed key character (i.e. for the F key, use the 'f' character). In case of a type event (first character is 't'), you can have several leters.&lt;br /&gt;
&lt;br /&gt;
Note that if you want to write something, &amp;quot;press&amp;quot; and &amp;quot;release&amp;quot; events are not enough. You '''need''' to send the corresponding &amp;quot;type&amp;quot; event. Press &amp;amp; release events are only required for control keys (backspace, return, tab, etc...). If you only want to type something, you should use the &amp;quot;type&amp;quot; function; it's a lot faster and also easier.&lt;br /&gt;
&lt;br /&gt;
Example code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
SEPARATOR = string.char(1)&lt;br /&gt;
&lt;br /&gt;
-- Press h key, release it, and then type &amp;quot;hello&amp;quot;&lt;br /&gt;
wdScreen.typeAdvanced(&amp;quot;ph&amp;quot; .. SEPARATOR .. &amp;quot;rh&amp;quot; .. SEPARATOR .. &amp;quot;thello&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=205</id>
		<title>OpenComputers Interface</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=205"/>
				<updated>2019-07-23T15:18:25Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* typeAdvanced, WebDisplays 1.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The OpenComputers Interface is a [[Screen#Peripheral|peripheral]] which can be used by OpenComputers computers to interact with screens.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Ocinterface.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the left is a [[Peripheral Base]], used to craft all peripherals.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
First, place the block next to an OpenComputers computer and link it to a screen using the [[Linking Tool]]. Then, you'll need its OpenComputers address, which can be obtained this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
component = component or require(&amp;quot;component&amp;quot;)&lt;br /&gt;
wdScreenAddress = nil&lt;br /&gt;
&lt;br /&gt;
for addr, name in component.list() do&lt;br /&gt;
    if name == &amp;quot;webdisplays&amp;quot; then&lt;br /&gt;
        wdScreenAddress = addr&lt;br /&gt;
        break&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if not wdScreenAddress then&lt;br /&gt;
    print(&amp;quot;Couldn't find WebDisplays screen&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you'll need a proxy to execute WebDisplays functions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen = component.proxy(wdScreenAddress)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This process is detailed on the [http://ocdoc.cil.li/component:component_access OpenComputers wiki].&lt;br /&gt;
&lt;br /&gt;
==Permissions==&lt;br /&gt;
This interface will have the same restrictions and permissions as the player who placed the block.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Function name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return values&lt;br /&gt;
!Comment&lt;br /&gt;
!Permission&lt;br /&gt;
|-&lt;br /&gt;
|isLinked||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|isScreenChunkLoaded||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenPos||None||number, number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenSide||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|getOwner||None||string, string||Returns name &amp;amp; UUID||&lt;br /&gt;
|-&lt;br /&gt;
|can||string||bool||Checks for permission. Permission name can be found in the &amp;quot;permission&amp;quot; column.||&lt;br /&gt;
|-&lt;br /&gt;
|hasUpgrade||string||bool||Upgrade name is case insensitive||&lt;br /&gt;
|-&lt;br /&gt;
|getSize||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getResolution||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getRotation||None||number||In degrees||&lt;br /&gt;
|-&lt;br /&gt;
|getURL||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|click||number, number, string||bool||Arguments are x, y, action. Action can by click, up, or down. Rotation is handled internally.||click&lt;br /&gt;
|-&lt;br /&gt;
|type||string||bool||||click&lt;br /&gt;
|-&lt;br /&gt;
|typeAdvanced||string/table||bool||Manually control key up/down events. Arguments depend the on WebDisplays version.||click&lt;br /&gt;
|-&lt;br /&gt;
|setURL||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|setResolution||number, number||bool||||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|setRotation||number||bool||In degrees||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|runJS||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|unlink||None||None||Why would anyone do that?||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.1===&lt;br /&gt;
In WebDisplays 1.1, typeAdvanced requires a table. Each value within this table contains a keyboard event to send to the screen. This event is described using yet another table containing the following fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Field name&lt;br /&gt;
!Value type&lt;br /&gt;
!Value description&lt;br /&gt;
|-&lt;br /&gt;
|action||string||Can be &amp;quot;press&amp;quot;, &amp;quot;release&amp;quot;, or &amp;quot;type&amp;quot;. This is case insensitive.&lt;br /&gt;
|-&lt;br /&gt;
|code||number||The corresponding key code. Useless when action is &amp;quot;type&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|char||string||The character corresponding to that key.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that if you want to write something, &amp;quot;press&amp;quot; and &amp;quot;release&amp;quot; events are not enough. You '''need''' to send the corresponding &amp;quot;type&amp;quot; event. Press &amp;amp; release events are only required for control keys (backspace, return, tab, etc...). If you only want to type something, you should use the &amp;quot;type&amp;quot; function; it's a lot faster and also easier.&lt;br /&gt;
&lt;br /&gt;
For a list of key codes, check out [[Key codes]].&lt;br /&gt;
&lt;br /&gt;
Example code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen.typeAdvanced{&lt;br /&gt;
    { action = &amp;quot;press&amp;quot;  , code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;release&amp;quot;, code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;type&amp;quot;   , char = &amp;quot;r&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.0===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=204</id>
		<title>OpenComputers Interface</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=204"/>
				<updated>2019-07-23T15:18:14Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* typeAdvanced, WebDisplays 1.1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The OpenComputers Interface is a [[Screen#Peripheral|peripheral]] which can be used by OpenComputers computers to interact with screens.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Ocinterface.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the left is a [[Peripheral Base]], used to craft all peripherals.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
First, place the block next to an OpenComputers computer and link it to a screen using the [[Linking Tool]]. Then, you'll need its OpenComputers address, which can be obtained this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
component = component or require(&amp;quot;component&amp;quot;)&lt;br /&gt;
wdScreenAddress = nil&lt;br /&gt;
&lt;br /&gt;
for addr, name in component.list() do&lt;br /&gt;
    if name == &amp;quot;webdisplays&amp;quot; then&lt;br /&gt;
        wdScreenAddress = addr&lt;br /&gt;
        break&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if not wdScreenAddress then&lt;br /&gt;
    print(&amp;quot;Couldn't find WebDisplays screen&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you'll need a proxy to execute WebDisplays functions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen = component.proxy(wdScreenAddress)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This process is detailed on the [http://ocdoc.cil.li/component:component_access OpenComputers wiki].&lt;br /&gt;
&lt;br /&gt;
==Permissions==&lt;br /&gt;
This interface will have the same restrictions and permissions as the player who placed the block.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Function name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return values&lt;br /&gt;
!Comment&lt;br /&gt;
!Permission&lt;br /&gt;
|-&lt;br /&gt;
|isLinked||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|isScreenChunkLoaded||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenPos||None||number, number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenSide||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|getOwner||None||string, string||Returns name &amp;amp; UUID||&lt;br /&gt;
|-&lt;br /&gt;
|can||string||bool||Checks for permission. Permission name can be found in the &amp;quot;permission&amp;quot; column.||&lt;br /&gt;
|-&lt;br /&gt;
|hasUpgrade||string||bool||Upgrade name is case insensitive||&lt;br /&gt;
|-&lt;br /&gt;
|getSize||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getResolution||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getRotation||None||number||In degrees||&lt;br /&gt;
|-&lt;br /&gt;
|getURL||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|click||number, number, string||bool||Arguments are x, y, action. Action can by click, up, or down. Rotation is handled internally.||click&lt;br /&gt;
|-&lt;br /&gt;
|type||string||bool||||click&lt;br /&gt;
|-&lt;br /&gt;
|typeAdvanced||string/table||bool||Manually control key up/down events. Arguments depend the on WebDisplays version.||click&lt;br /&gt;
|-&lt;br /&gt;
|setURL||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|setResolution||number, number||bool||||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|setRotation||number||bool||In degrees||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|runJS||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|unlink||None||None||Why would anyone do that?||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.1===&lt;br /&gt;
In WebDisplays 1.1, typeAdvanced requires a table. Each value within this table contains a keyboard event to send to the screen. This event is described using yet another table containing the following fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Field name&lt;br /&gt;
!Value type&lt;br /&gt;
!Value description&lt;br /&gt;
|-&lt;br /&gt;
|action||string||Can be &amp;quot;press&amp;quot;, &amp;quot;release&amp;quot;, or &amp;quot;type&amp;quot;. This is case insensitive.&lt;br /&gt;
|-&lt;br /&gt;
|code||number||The corresponding key code. Useless when action is &amp;quot;type&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|char||string||The character corresponding to that key.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that if you want to write something, &amp;quot;press&amp;quot; and &amp;quot;release&amp;quot; events are not enough. You '''need''' to send the corresponding &amp;quot;type&amp;quot; event. Press &amp;amp; release events are only required for control keys (backspace, return, tab, etc...). If you only want to type something, you should use the &amp;quot;type&amp;quot; function; it's a lot faster and also easier.&lt;br /&gt;
&lt;br /&gt;
For a list of key codes, check out [[Key_codes]].&lt;br /&gt;
&lt;br /&gt;
Example code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen.typeAdvanced{&lt;br /&gt;
    { action = &amp;quot;press&amp;quot;  , code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;release&amp;quot;, code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;type&amp;quot;   , char = &amp;quot;r&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.0===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Key_codes&amp;diff=203</id>
		<title>Key codes</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Key_codes&amp;diff=203"/>
				<updated>2019-07-23T15:16:34Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: Created page with &amp;quot;List of key codes, generated from LWJGL's keyboard file. You can copy/paste this into a lua file.  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt; KEY_ESCAPE       = 1 KEY_1...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;List of key codes, generated from LWJGL's keyboard file. You can copy/paste this into a lua file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
KEY_ESCAPE       = 1&lt;br /&gt;
KEY_1            = 2&lt;br /&gt;
KEY_2            = 3&lt;br /&gt;
KEY_3            = 4&lt;br /&gt;
KEY_4            = 5&lt;br /&gt;
KEY_5            = 6&lt;br /&gt;
KEY_6            = 7&lt;br /&gt;
KEY_7            = 8&lt;br /&gt;
KEY_8            = 9&lt;br /&gt;
KEY_9            = 10&lt;br /&gt;
KEY_0            = 11&lt;br /&gt;
KEY_MINUS        = 12  -- - on main keyboard&lt;br /&gt;
KEY_EQUALS       = 13&lt;br /&gt;
KEY_BACK         = 14  -- backspace&lt;br /&gt;
KEY_TAB          = 15&lt;br /&gt;
KEY_Q            = 16&lt;br /&gt;
KEY_W            = 17&lt;br /&gt;
KEY_E            = 18&lt;br /&gt;
KEY_R            = 19&lt;br /&gt;
KEY_T            = 20&lt;br /&gt;
KEY_Y            = 21&lt;br /&gt;
KEY_U            = 22&lt;br /&gt;
KEY_I            = 23&lt;br /&gt;
KEY_O            = 24&lt;br /&gt;
KEY_P            = 25&lt;br /&gt;
KEY_LBRACKET     = 26&lt;br /&gt;
KEY_RBRACKET     = 27&lt;br /&gt;
KEY_RETURN       = 28  -- Enter on main keyboard&lt;br /&gt;
KEY_LCONTROL     = 29&lt;br /&gt;
KEY_A            = 30&lt;br /&gt;
KEY_S            = 31&lt;br /&gt;
KEY_D            = 32&lt;br /&gt;
KEY_F            = 33&lt;br /&gt;
KEY_G            = 34&lt;br /&gt;
KEY_H            = 35&lt;br /&gt;
KEY_J            = 36&lt;br /&gt;
KEY_K            = 37&lt;br /&gt;
KEY_L            = 38&lt;br /&gt;
KEY_SEMICOLON    = 39&lt;br /&gt;
KEY_APOSTROPHE   = 40&lt;br /&gt;
KEY_GRAVE        = 41  -- accent grave&lt;br /&gt;
KEY_LSHIFT       = 42&lt;br /&gt;
KEY_BACKSLASH    = 43&lt;br /&gt;
KEY_Z            = 44&lt;br /&gt;
KEY_X            = 45&lt;br /&gt;
KEY_C            = 46&lt;br /&gt;
KEY_V            = 47&lt;br /&gt;
KEY_B            = 48&lt;br /&gt;
KEY_N            = 49&lt;br /&gt;
KEY_M            = 50&lt;br /&gt;
KEY_COMMA        = 51&lt;br /&gt;
KEY_PERIOD       = 52  -- . on main keyboard&lt;br /&gt;
KEY_SLASH        = 53  -- / on main keyboard&lt;br /&gt;
KEY_RSHIFT       = 54&lt;br /&gt;
KEY_MULTIPLY     = 55  -- * on numeric keypad&lt;br /&gt;
KEY_LMENU        = 56  -- left Alt&lt;br /&gt;
KEY_SPACE        = 57&lt;br /&gt;
KEY_CAPITAL      = 58&lt;br /&gt;
KEY_F1           = 59&lt;br /&gt;
KEY_F2           = 60&lt;br /&gt;
KEY_F3           = 61&lt;br /&gt;
KEY_F4           = 62&lt;br /&gt;
KEY_F5           = 63&lt;br /&gt;
KEY_F6           = 64&lt;br /&gt;
KEY_F7           = 65&lt;br /&gt;
KEY_F8           = 66&lt;br /&gt;
KEY_F9           = 67&lt;br /&gt;
KEY_F10          = 68&lt;br /&gt;
KEY_NUMLOCK      = 69&lt;br /&gt;
KEY_SCROLL       = 70  -- Scroll Lock&lt;br /&gt;
KEY_NUMPAD7      = 71&lt;br /&gt;
KEY_NUMPAD8      = 72&lt;br /&gt;
KEY_NUMPAD9      = 73&lt;br /&gt;
KEY_SUBTRACT     = 74  -- - on numeric keypad&lt;br /&gt;
KEY_NUMPAD4      = 75&lt;br /&gt;
KEY_NUMPAD5      = 76&lt;br /&gt;
KEY_NUMPAD6      = 77&lt;br /&gt;
KEY_ADD          = 78  -- + on numeric keypad&lt;br /&gt;
KEY_NUMPAD1      = 79&lt;br /&gt;
KEY_NUMPAD2      = 80&lt;br /&gt;
KEY_NUMPAD3      = 81&lt;br /&gt;
KEY_NUMPAD0      = 82&lt;br /&gt;
KEY_DECIMAL      = 83  -- . on numeric keypad&lt;br /&gt;
KEY_F11          = 87&lt;br /&gt;
KEY_F12          = 88&lt;br /&gt;
KEY_F13          = 100 -- (NEC PC98)&lt;br /&gt;
KEY_F14          = 101 -- (NEC PC98)&lt;br /&gt;
KEY_F15          = 102 -- (NEC PC98)&lt;br /&gt;
KEY_F16          = 103 -- Extended Function keys - (Mac)&lt;br /&gt;
KEY_F17          = 104&lt;br /&gt;
KEY_F18          = 105&lt;br /&gt;
KEY_KANA         = 112 -- (Japanese keyboard)&lt;br /&gt;
KEY_F19          = 113 -- Extended Function keys - (Mac)&lt;br /&gt;
KEY_CONVERT      = 121 -- (Japanese keyboard)&lt;br /&gt;
KEY_NOCONVERT    = 123 -- (Japanese keyboard)&lt;br /&gt;
KEY_YEN          = 125 -- (Japanese keyboard)&lt;br /&gt;
KEY_NUMPADEQUALS = 141 -- = on numeric keypad (NEC PC98)&lt;br /&gt;
KEY_CIRCUMFLEX   = 144 -- (Japanese keyboard)&lt;br /&gt;
KEY_AT           = 145 -- (NEC PC98)&lt;br /&gt;
KEY_COLON        = 146 -- (NEC PC98)&lt;br /&gt;
KEY_UNDERLINE    = 147 -- (NEC PC98)&lt;br /&gt;
KEY_KANJI        = 148 -- (Japanese keyboard)&lt;br /&gt;
KEY_STOP         = 149 -- (NEC PC98)&lt;br /&gt;
KEY_AX           = 150 -- (Japan AX)&lt;br /&gt;
KEY_UNLABELED    = 151 -- (J3100)&lt;br /&gt;
KEY_NUMPADENTER  = 156 -- Enter on numeric keypad&lt;br /&gt;
KEY_RCONTROL     = 157&lt;br /&gt;
KEY_SECTION      = 167 -- Section symbol (Mac)&lt;br /&gt;
KEY_NUMPADCOMMA  = 179 -- , on numeric keypad (NEC PC98)&lt;br /&gt;
KEY_DIVIDE       = 181 -- / on numeric keypad&lt;br /&gt;
KEY_SYSRQ        = 183&lt;br /&gt;
KEY_RMENU        = 184 -- right Alt&lt;br /&gt;
KEY_FUNCTION     = 196 -- Function (Mac)&lt;br /&gt;
KEY_PAUSE        = 197 -- Pause&lt;br /&gt;
KEY_HOME         = 199 -- Home on arrow keypad&lt;br /&gt;
KEY_UP           = 200 -- UpArrow on arrow keypad&lt;br /&gt;
KEY_PRIOR        = 201 -- PgUp on arrow keypad&lt;br /&gt;
KEY_LEFT         = 203 -- LeftArrow on arrow keypad&lt;br /&gt;
KEY_RIGHT        = 205 -- RightArrow on arrow keypad&lt;br /&gt;
KEY_END          = 207 -- End on arrow keypad&lt;br /&gt;
KEY_DOWN         = 208 -- DownArrow on arrow keypad&lt;br /&gt;
KEY_NEXT         = 209 -- PgDn on arrow keypad&lt;br /&gt;
KEY_INSERT       = 210 -- Insert on arrow keypad&lt;br /&gt;
KEY_DELETE       = 211 -- Delete on arrow keypad&lt;br /&gt;
KEY_CLEAR        = 218 -- Clear key (Mac)&lt;br /&gt;
KEY_LMETA        = 219 -- Left Windows/Option key&lt;br /&gt;
KEY_RMETA        = 220 -- Right Windows/Option key&lt;br /&gt;
KEY_APPS         = 221 -- AppMenu key&lt;br /&gt;
KEY_POWER        = 222&lt;br /&gt;
KEY_SLEEP        = 223&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=202</id>
		<title>OpenComputers Interface</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=202"/>
				<updated>2019-07-23T14:56:51Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The OpenComputers Interface is a [[Screen#Peripheral|peripheral]] which can be used by OpenComputers computers to interact with screens.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Ocinterface.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the left is a [[Peripheral Base]], used to craft all peripherals.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
First, place the block next to an OpenComputers computer and link it to a screen using the [[Linking Tool]]. Then, you'll need its OpenComputers address, which can be obtained this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
component = component or require(&amp;quot;component&amp;quot;)&lt;br /&gt;
wdScreenAddress = nil&lt;br /&gt;
&lt;br /&gt;
for addr, name in component.list() do&lt;br /&gt;
    if name == &amp;quot;webdisplays&amp;quot; then&lt;br /&gt;
        wdScreenAddress = addr&lt;br /&gt;
        break&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if not wdScreenAddress then&lt;br /&gt;
    print(&amp;quot;Couldn't find WebDisplays screen&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you'll need a proxy to execute WebDisplays functions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen = component.proxy(wdScreenAddress)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This process is detailed on the [http://ocdoc.cil.li/component:component_access OpenComputers wiki].&lt;br /&gt;
&lt;br /&gt;
==Permissions==&lt;br /&gt;
This interface will have the same restrictions and permissions as the player who placed the block.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Function name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return values&lt;br /&gt;
!Comment&lt;br /&gt;
!Permission&lt;br /&gt;
|-&lt;br /&gt;
|isLinked||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|isScreenChunkLoaded||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenPos||None||number, number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenSide||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|getOwner||None||string, string||Returns name &amp;amp; UUID||&lt;br /&gt;
|-&lt;br /&gt;
|can||string||bool||Checks for permission. Permission name can be found in the &amp;quot;permission&amp;quot; column.||&lt;br /&gt;
|-&lt;br /&gt;
|hasUpgrade||string||bool||Upgrade name is case insensitive||&lt;br /&gt;
|-&lt;br /&gt;
|getSize||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getResolution||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getRotation||None||number||In degrees||&lt;br /&gt;
|-&lt;br /&gt;
|getURL||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|click||number, number, string||bool||Arguments are x, y, action. Action can by click, up, or down. Rotation is handled internally.||click&lt;br /&gt;
|-&lt;br /&gt;
|type||string||bool||||click&lt;br /&gt;
|-&lt;br /&gt;
|typeAdvanced||string/table||bool||Manually control key up/down events. Arguments depend the on WebDisplays version.||click&lt;br /&gt;
|-&lt;br /&gt;
|setURL||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|setResolution||number, number||bool||||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|setRotation||number||bool||In degrees||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|runJS||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|unlink||None||None||Why would anyone do that?||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.1===&lt;br /&gt;
In WebDisplays 1.1, typeAdvanced requires a table. Each value within this table contains a keyboard event to send to the screen. This event is described using yet another table containing the following fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Field name&lt;br /&gt;
!Value type&lt;br /&gt;
!Value description&lt;br /&gt;
|-&lt;br /&gt;
|action||string||Can be &amp;quot;press&amp;quot;, &amp;quot;release&amp;quot;, or &amp;quot;type&amp;quot;. This is case insensitive.&lt;br /&gt;
|-&lt;br /&gt;
|code||number||The corresponding key code. Useless when action is &amp;quot;type&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|char||string||The character corresponding to that key.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that if you want to write something, &amp;quot;press&amp;quot; and &amp;quot;release&amp;quot; events are not enough. You '''need''' to send the corresponding &amp;quot;type&amp;quot; event. Press &amp;amp; release events are only required for control keys (backspace, return, tab, etc...). If you only want to type something, you should use the &amp;quot;type&amp;quot; function; it's a lot faster and also easier.&lt;br /&gt;
&lt;br /&gt;
Example code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen.typeAdvanced{&lt;br /&gt;
    { action = &amp;quot;press&amp;quot;  , code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;release&amp;quot;, code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;type&amp;quot;   , char = &amp;quot;r&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.0===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=201</id>
		<title>OpenComputers Interface</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=201"/>
				<updated>2019-07-23T14:55:55Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The OpenComputers Interface is a [[Screen#Peripheral|peripheral]] which can be used by OpenComputers computers to interact with screens.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Ocinterface.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the left is a [[Peripheral Base]], used to craft all peripherals.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
First, place the block next to an OpenComputers computer and link it to a screen using the [[Linking Tool]]. Then, you'll need its OpenComputers address, which can be obtained this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
component = component or require(&amp;quot;component&amp;quot;)&lt;br /&gt;
wdScreenAddress = nil&lt;br /&gt;
&lt;br /&gt;
for addr, name in component.list() do&lt;br /&gt;
    if name == &amp;quot;webdisplays&amp;quot; then&lt;br /&gt;
        wdScreenAddress = addr&lt;br /&gt;
        break&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if not wdScreenAddress then&lt;br /&gt;
    print(&amp;quot;Couldn't find WebDisplays screen&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you'll need a proxy to execute WebDisplays functions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen = component.proxy(wdScreenAddress)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This process is detailed on the [http://ocdoc.cil.li/component:component_access OpenComputers wiki].&lt;br /&gt;
&lt;br /&gt;
==Permissions==&lt;br /&gt;
This interface will have the same restrictions and permissions as the player who placed the block.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Function name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return values&lt;br /&gt;
!Comment&lt;br /&gt;
!Permission&lt;br /&gt;
|-&lt;br /&gt;
|isLinked||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|isScreenChunkLoaded||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenPos||None||number, number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenSide||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|getOwner||None||string, string||Returns name &amp;amp; UUID||&lt;br /&gt;
|-&lt;br /&gt;
|can||string||bool||Checks for permission. Permission name can be found in the &amp;quot;permission&amp;quot; column.||&lt;br /&gt;
|-&lt;br /&gt;
|hasUpgrade||string||bool||Upgrade name is case insensitive||&lt;br /&gt;
|-&lt;br /&gt;
|getSize||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getResolution||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getRotation||None||number||In degrees||&lt;br /&gt;
|-&lt;br /&gt;
|getURL||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|click||number, number, string||bool||Arguments are x, y, action. Action can by click, up, or down. Rotation is handled internally.||click&lt;br /&gt;
|-&lt;br /&gt;
|type||string||bool||||click&lt;br /&gt;
|-&lt;br /&gt;
|typeAdvanced||string/table||bool||Manually control key up/down events. Arguments depends the on WebDisplays version.||click&lt;br /&gt;
|-&lt;br /&gt;
|setURL||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|setResolution||number, number||bool||||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|setRotation||number||bool||In degrees||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|runJS||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|unlink||None||None||Why would anyone do that?||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.1===&lt;br /&gt;
In WebDisplays 1.1, typeAdvanced requires a table. Each value within this table contains a keyboard event to send to the screen. This event is described using yet another table containing the following fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Field name&lt;br /&gt;
!Value type&lt;br /&gt;
!Value description&lt;br /&gt;
|-&lt;br /&gt;
|action||string||Can be &amp;quot;press&amp;quot;, &amp;quot;release&amp;quot;, or &amp;quot;type&amp;quot;. This is case insensitive.&lt;br /&gt;
|-&lt;br /&gt;
|code||number||The corresponding key code. Useless when action is &amp;quot;type&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|char||string||The character corresponding to that key.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that if you want to write something, &amp;quot;press&amp;quot; and &amp;quot;release&amp;quot; events are not enough. You '''need''' to send the corresponding &amp;quot;type&amp;quot; event. Press &amp;amp; release events are only required for control keys (backspace, return, tab, etc...). If you only want to type something, you should use the &amp;quot;type&amp;quot; function; it's a lot faster and also easier.&lt;br /&gt;
&lt;br /&gt;
Example code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen.typeAdvanced{&lt;br /&gt;
    { action = &amp;quot;press&amp;quot;  , code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;release&amp;quot;, code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;type&amp;quot;   , char = &amp;quot;r&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.0===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=200</id>
		<title>OpenComputers Interface</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=200"/>
				<updated>2019-07-23T14:54:20Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The OpenComputers Interface is a [[Screen#Peripheral|peripheral]] which can be used by OpenComputers computers to interact with screens.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Ocinterface.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the left is a [[Peripheral Base]], used to craft all peripherals.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
First, place the block next to an OpenComputers computer and link it to a screen using the [[Linking Tool]]. Then, you'll need its OpenComputers address, which can be obtained this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
component = component or require(&amp;quot;component&amp;quot;)&lt;br /&gt;
wdScreenAddress = nil&lt;br /&gt;
&lt;br /&gt;
for addr, name in component.list() do&lt;br /&gt;
    if name == &amp;quot;webdisplays&amp;quot; then&lt;br /&gt;
        wdScreenAddress = addr&lt;br /&gt;
        break&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if not wdScreenAddress then&lt;br /&gt;
    print(&amp;quot;Couldn't find WebDisplays screen&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you'll need a proxy to execute WebDisplays functions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen = component.proxy(wdScreenAddress)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This process is detailed on the [http://ocdoc.cil.li/component:component_access OpenComputers wiki].&lt;br /&gt;
&lt;br /&gt;
==Permissions==&lt;br /&gt;
This interface will have the same restrictions and permissions as the player who placed the block.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Function name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return values&lt;br /&gt;
!Comment&lt;br /&gt;
!Permission&lt;br /&gt;
|-&lt;br /&gt;
|isLinked||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|isScreenChunkLoaded||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenPos||None||number, number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenSide||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|getOwner||None||string, string||Returns name &amp;amp; UUID||&lt;br /&gt;
|-&lt;br /&gt;
|can||string||bool||Checks for permission. Permission name can be found in the &amp;quot;permission&amp;quot; column.||&lt;br /&gt;
|-&lt;br /&gt;
|hasUpgrade||string||bool||Upgrade name is case insensitive||&lt;br /&gt;
|-&lt;br /&gt;
|getSize||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getResolution||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getRotation||None||number||In degrees||&lt;br /&gt;
|-&lt;br /&gt;
|getURL||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|click||number, number, string||bool||Arguments are x, y, action. Action can by click, up, or down. Rotation is handled internally.||click&lt;br /&gt;
|-&lt;br /&gt;
|type||string||bool||||click&lt;br /&gt;
|-&lt;br /&gt;
|typeAdvanced||string/table||bool||Manually control key up/down events. Arguments depends the on WebDisplays version.||click&lt;br /&gt;
|-&lt;br /&gt;
|setURL||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|setResolution||number, number||bool||||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|setRotation||number||bool||In degrees||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|runJS||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|unlink||None||None||Why would anyone do that?||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.1===&lt;br /&gt;
In WebDisplays 1.1, typeAdvanced requires a table. Each value within this table contains a keyboard event to send to the screen. This event is described using yet another table containing the following fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Field name&lt;br /&gt;
!Value type&lt;br /&gt;
!Value description&lt;br /&gt;
|-&lt;br /&gt;
|action||string||Can be &amp;quot;press&amp;quot;, &amp;quot;release&amp;quot;, or &amp;quot;type&amp;quot;. This is case insensitive.&lt;br /&gt;
|-&lt;br /&gt;
|code||number||The corresponding key code. Useless when action is &amp;quot;type&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|char||string||The character corresponding to that key.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that if you want to write something, &amp;quot;press&amp;quot; and &amp;quot;release&amp;quot; events are not enough. You **need** to send the corresponding &amp;quot;type&amp;quot; event. Press &amp;amp; release events are only required for control keys (backspace, return, tab, etc...). If you only want to type something, you should use the &amp;quot;type&amp;quot; function; it's a lot faster and also easier.&lt;br /&gt;
&lt;br /&gt;
Example code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen.typeAdvanced{&lt;br /&gt;
    { action = &amp;quot;press&amp;quot;  , code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;release&amp;quot;, code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;type&amp;quot;   , char = &amp;quot;r&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.0===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=199</id>
		<title>OpenComputers Interface</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=OpenComputers_Interface&amp;diff=199"/>
				<updated>2019-07-23T14:53:14Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The OpenComputers Interface is a [[Screen#Peripheral|peripheral]] which can be used by OpenComputers computers to interact with screens.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Ocinterface.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the left is a [[Peripheral Base]], used to craft all peripherals.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
First, place the block next to an OpenComputers computer and link it to a screen using the [[Linking Tool]]. Then, you'll need its OpenComputers address, which can be obtained this way:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
component = component or require(&amp;quot;component&amp;quot;)&lt;br /&gt;
wdScreenAddress = nil&lt;br /&gt;
&lt;br /&gt;
for addr, name in component.list() do&lt;br /&gt;
    if name == &amp;quot;webdisplays&amp;quot; then&lt;br /&gt;
        wdScreenAddress = addr&lt;br /&gt;
        break&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if not wdScreenAddress then&lt;br /&gt;
    print(&amp;quot;Couldn't find WebDisplays screen&amp;quot;)&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, you'll need a proxy to execute WebDisplays functions:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen = component.proxy(wdScreenAddress)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This process is detailed on the [http://ocdoc.cil.li/component:component_access OpenComputers wiki].&lt;br /&gt;
&lt;br /&gt;
==Permissions==&lt;br /&gt;
This interface will have the same restrictions and permissions as the player who placed the block.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Function name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return values&lt;br /&gt;
!Comment&lt;br /&gt;
!Permission&lt;br /&gt;
|-&lt;br /&gt;
|isLinked||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|isScreenChunkLoaded||None||bool||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenPos||None||number, number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getScreenSide||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|getOwner||None||string, string||Returns name &amp;amp; UUID||&lt;br /&gt;
|-&lt;br /&gt;
|can||string||bool||Checks for permission. Permission name can be found in the &amp;quot;permission&amp;quot; column.||&lt;br /&gt;
|-&lt;br /&gt;
|hasUpgrade||string||bool||Upgrade name is case insensitive||&lt;br /&gt;
|-&lt;br /&gt;
|getSize||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getResolution||None||number, number||||&lt;br /&gt;
|-&lt;br /&gt;
|getRotation||None||number||In degrees||&lt;br /&gt;
|-&lt;br /&gt;
|getURL||None||string||||&lt;br /&gt;
|-&lt;br /&gt;
|click||number, number, string||bool||Arguments are x, y, action. Action can by click, up, or down. Rotation is handled internally.||click&lt;br /&gt;
|-&lt;br /&gt;
|type||string||bool||||click&lt;br /&gt;
|-&lt;br /&gt;
|typeAdvanced||string/table||bool||Manually control key up/down events. Arguments depends the on WebDisplays version.||click&lt;br /&gt;
|-&lt;br /&gt;
|setURL||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|setResolution||number, number||bool||||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|setRotation||number||bool||In degrees||setresolution&lt;br /&gt;
|-&lt;br /&gt;
|runJS||string||bool||||seturl&lt;br /&gt;
|-&lt;br /&gt;
|unlink||None||None||Why would anyone do that?||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.1===&lt;br /&gt;
In WebDisplays 1.1, typeAdvanced requires a table. Each value within this table contains a keyboard event to send to the screen. This event is described using yet another table containing the following fields:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Field name&lt;br /&gt;
!Value type&lt;br /&gt;
!Value description&lt;br /&gt;
|-&lt;br /&gt;
|action||string||Can be &amp;quot;press&amp;quot;, &amp;quot;release&amp;quot;, or &amp;quot;type&amp;quot;. This is case insensitive.||&lt;br /&gt;
|-&lt;br /&gt;
|code||number||The corresponding key code. Useless when action is &amp;quot;type&amp;quot;.||&lt;br /&gt;
|-&lt;br /&gt;
|char||string||The character corresponding to that key.||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that if you want to write something, &amp;quot;press&amp;quot; and &amp;quot;release&amp;quot; events are not enough. You **need** to send the corresponding &amp;quot;type&amp;quot; event. Press &amp;amp; release events are only required for control keys (backspace, return, tab, etc...). If you only want to type something, you should use the &amp;quot;type&amp;quot; function; it's a lot faster and also easier.&lt;br /&gt;
&lt;br /&gt;
Example code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; line='line'&amp;gt;&lt;br /&gt;
wdScreen.typeAdvanced{&lt;br /&gt;
    { action = &amp;quot;press&amp;quot;  , code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;release&amp;quot;, code = 19, char = &amp;quot;r&amp;quot; },&lt;br /&gt;
    { action = &amp;quot;type&amp;quot;   , char = &amp;quot;r&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===typeAdvanced, WebDisplays 1.0===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=198</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=198"/>
				<updated>2018-10-21T13:09:22Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Les commandes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
|Si a &amp;gt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
|Si a &amp;gt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
|Si a &amp;lt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
|Si a &amp;lt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
|Si a == b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
|Si a != b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
|Si a == 0, 0 ; sinon b (et logique)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;#124;&amp;amp;#124;&lt;br /&gt;
|Si a == 0, b ; sinon a (ou logique)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!react===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!react emoji&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;!react emoji messageID&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajoute la réaction 'emoji' au message identifié par l'ID 'messageID'. Si l'identifiant du message n'est pas présent, la réaction sera ajoutée au message qui invoque cette commande.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
===!say===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!say message à écrire&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.&lt;br /&gt;
&lt;br /&gt;
===!script===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script commande1, commande2, commande3, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
* ou &amp;lt;code&amp;gt;!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}&amp;lt;/code&amp;gt; avec des arguments nommés&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=197</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=197"/>
				<updated>2018-10-21T12:15:58Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* !math */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
|Si a &amp;gt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
|Si a &amp;gt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
|Si a &amp;lt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
|Si a &amp;lt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
|Si a == b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
|Si a != b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
|Si a == 0, 0 ; sinon b (et logique)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;#124;&amp;amp;#124;&lt;br /&gt;
|Si a == 0, b ; sinon a (ou logique)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
===!say===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!say message à écrire&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.&lt;br /&gt;
&lt;br /&gt;
===!script===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script commande1, commande2, commande3, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
* ou &amp;lt;code&amp;gt;!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}&amp;lt;/code&amp;gt; avec des arguments nommés&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=196</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=196"/>
				<updated>2018-10-21T12:15:06Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* !math */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
|Si a &amp;gt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
|Si a &amp;gt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
|Si a &amp;lt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
|Si a &amp;lt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
|Si a == b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
|Si a != b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
|Si a == 0, 0 ; sinon b (et logique)&lt;br /&gt;
|-&lt;br /&gt;
| {{!}}{{!}}&lt;br /&gt;
|Si a == 0, b ; sinon a (ou logique)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
===!say===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!say message à écrire&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.&lt;br /&gt;
&lt;br /&gt;
===!script===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script commande1, commande2, commande3, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
* ou &amp;lt;code&amp;gt;!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}&amp;lt;/code&amp;gt; avec des arguments nommés&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=195</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=195"/>
				<updated>2018-10-21T12:13:23Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* !math */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
|Si a &amp;gt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
|Si a &amp;gt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
|Si a &amp;lt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
|Si a &amp;lt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
|Si a == b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
|Si a != b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
|Si a == 0, 0 ; sinon b (et logique)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;vert;&amp;amp;vert;&lt;br /&gt;
|Si a == 0, b ; sinon a (ou logique)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
===!say===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!say message à écrire&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.&lt;br /&gt;
&lt;br /&gt;
===!script===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script commande1, commande2, commande3, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
* ou &amp;lt;code&amp;gt;!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}&amp;lt;/code&amp;gt; avec des arguments nommés&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=194</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=194"/>
				<updated>2018-10-21T12:12:51Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* !math */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
|Si a &amp;gt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
|Si a &amp;gt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
|Si a &amp;lt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
|Si a &amp;lt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
|Si a == b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
|Si a != b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
|Si a == 0, 0 ; sinon b (et logique)&lt;br /&gt;
|-&lt;br /&gt;
| {{#!: | }}&lt;br /&gt;
|Si a == 0, b ; sinon a (ou logique)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
===!say===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!say message à écrire&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.&lt;br /&gt;
&lt;br /&gt;
===!script===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script commande1, commande2, commande3, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
* ou &amp;lt;code&amp;gt;!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}&amp;lt;/code&amp;gt; avec des arguments nommés&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=193</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=193"/>
				<updated>2018-10-21T12:11:22Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
|Si a &amp;gt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
|Si a &amp;gt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
|Si a &amp;lt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
|Si a &amp;lt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
|Si a == b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
|Si a != b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
|Si a == 0, 0 ; sinon b (et logique)&lt;br /&gt;
|-&lt;br /&gt;
| {{#!:||}}&lt;br /&gt;
|Si a == 0, b ; sinon a (ou logique)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
===!say===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!say message à écrire&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.&lt;br /&gt;
&lt;br /&gt;
===!script===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script commande1, commande2, commande3, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
* ou &amp;lt;code&amp;gt;!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}&amp;lt;/code&amp;gt; avec des arguments nommés&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=192</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=192"/>
				<updated>2018-10-21T12:06:42Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
|Si a &amp;gt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
|Si a &amp;gt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
|Si a &amp;lt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
|Si a &amp;lt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
|Si a == b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
|Si a != b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
|Si a == 0, 0 ; sinon b (et logique)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;&lt;br /&gt;
|Si a == 0, b ; sinon a (ou logique)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
===!say===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!say message à écrire&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.&lt;br /&gt;
&lt;br /&gt;
===!script===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script commande1, commande2, commande3, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
* ou &amp;lt;code&amp;gt;!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}&amp;lt;/code&amp;gt; avec des arguments nommés&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=191</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=191"/>
				<updated>2018-10-21T12:05:25Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;=&lt;br /&gt;
|Si a &amp;gt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;gt;&lt;br /&gt;
|Si a &amp;gt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;=&lt;br /&gt;
|Si a &amp;lt;= b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;&lt;br /&gt;
|Si a &amp;lt; b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| ==&lt;br /&gt;
|Si a == b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| !=&lt;br /&gt;
|Si a != b, 1 ; sinon 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;&amp;amp;&lt;br /&gt;
|Si a == 0, 0 ; sinon b (et logique)&lt;br /&gt;
|-&lt;br /&gt;
| ||&lt;br /&gt;
|Si a == 0, b ; sinon a (ou logique)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
===!say===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!say message à écrire&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande écrit dans le chat le message passé en paramètres. Elle n'est utile que dans le cas où vous souhaitez utiliser des arguments nommé pour écrire dans le chat.&lt;br /&gt;
&lt;br /&gt;
===!script===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script commande1, commande2, commande3, ...&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande exécute les commandes qui lui sont passées en paramètres tour à tour.&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
* ou &amp;lt;code&amp;gt;!macro add spam !{meme, count}repeat ${count} !{i}math ${i} *i 100 !{result}in ${result}ms !am ${meme}&amp;lt;/code&amp;gt; avec des arguments nommés&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=190</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=190"/>
				<updated>2018-10-21T10:53:10Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a trois principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et les deux autres portent sur les tokens.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens numérotés ($x)===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
===Les tokens nommés===&lt;br /&gt;
Comme vous l'avez vu dans la section précédente, c'est le bordel avec les tokens numérotés. J'ai donc ajouté &amp;quot;les tokens nommés&amp;quot;. Il permettent d'assigner un nom au lieu d'un numéro, ce qui améliore la lisibilité et permet de ne pas s'emmerder avec 50 000 échappements du symbole '$', comme nous allons le voir.&lt;br /&gt;
&lt;br /&gt;
Cela ce fait en deux étapes :&lt;br /&gt;
# Déclaration : On liste les noms de chaque tokens utilisés: &amp;lt;code&amp;gt;!{token1, token2, ...}nom_de_la_commande&amp;lt;/code&amp;gt;&lt;br /&gt;
# Invocation : Chaque occurrence &amp;lt;code&amp;gt;${nom_du_token}&amp;lt;/code&amp;gt; sera remplacée par sa valeur&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;code&amp;gt;!{token1, token2, token3}commande ${token1} ${token2} ${token3}&amp;lt;/code&amp;gt; aura le même effet que &amp;lt;code&amp;gt;!commande $0 $1 $2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Lors de l'invocation, si le nom du token n'existe pas dans la déclaration, il ne sera pas remplacé. Ainsi, dans &amp;lt;code&amp;gt;!{un_token}commande ${un_autre_token}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt; ne bougera pas et restera toujours &amp;lt;code&amp;gt;${un_autre_token}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Reprenons l'exemple de la partie ci-dessus :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !{nombre_1}random 1 6 !{nombre_2}say Le premier nombre est ${nombre_1} et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;&lt;br /&gt;
Plus simple, non ? Vous remarquerez tout de même l'utilisation de la commande &amp;lt;code&amp;gt;!say&amp;lt;/code&amp;gt; (qui, au cas où c'était pas évident, écrit dans le chat). On est contraint de l'utiliser car '''les tokens nommés ne fonctionnent qu'avec les commandes'''. Sans tokens nommés, cette commande est inutile.&lt;br /&gt;
&lt;br /&gt;
Bref, voyons le fonctionnement du code ci-dessus en détails :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_1} par $0, soit x. Donc, elle exécutera &amp;lt;code&amp;gt;!random 1 6 !{nombre_2}say Le premier nombre est x et le deuxième ${nombre_2}&amp;lt;/code&amp;gt;. Comme elle ne connaît pas de token nommé &amp;quot;nombre_2&amp;quot;, elle ne touche pas à ${token_2} et le laisse intacte.&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, il y a un token nommé. Elle sait qu'elle devra remplacer ${nombre_2} par $0, soit y. Elle écrira donc dans le chat &amp;quot;Le premier nombre est x et le deuxième y&amp;quot; comme prévu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=189</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=189"/>
				<updated>2018-10-20T13:13:41Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=188</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=188"/>
				<updated>2018-10-20T13:12:38Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;br /&gt;
&lt;br /&gt;
==Exemple==&lt;br /&gt;
On souhaite spammer avec des mêmes audios. Disons, 20 fois le &amp;quot;AH !&amp;quot; de Denis.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est bien, mais tout se lance en même temps car '''!am n'attends pas la fin du meme audio'''.&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat 20 !math $0 *i 100 !in $$0ms !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande va lancer :&lt;br /&gt;
# !in 0ms !am db_ah&lt;br /&gt;
# !in 100ms !am db_ah&lt;br /&gt;
# !in 200ms !am db_ah&lt;br /&gt;
# ...&lt;br /&gt;
# !in 2000ms !am db_ah&lt;br /&gt;
&lt;br /&gt;
Autrement dit, elle va jouer &amp;quot;db_ah&amp;quot; toute les 100ms. Parfait. Maintenant que ça marche comme on veut, on va mettre le tout dans une macro 'spam' prenant en paramètre le meme à spam et le nombre de fois qu'on veut le spammer :&lt;br /&gt;
* &amp;lt;code&amp;gt;!macro add spam !repeat $1 !math $$0 *i 100 !in $$$$0ms !am $0&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Plus qu'a lancer la macro avec &amp;lt;code&amp;gt;!macro exec spam db_ah 20&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=187</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=187"/>
				<updated>2018-10-20T13:04:22Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* !chatbot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [[Gründer Chatbot|ici]].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=186</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=186"/>
				<updated>2018-10-20T13:04:12Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* !repeat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [Gründer Chatbot|ici].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter le spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=185</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=185"/>
				<updated>2018-10-20T13:03:54Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Les commandes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [Gründer Chatbot|ici].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=184</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=184"/>
				<updated>2018-10-20T13:03:17Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Les commandes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!chatbot===&lt;br /&gt;
Permet d’exécuter une commande lorsqu'un pattern est détecté dans le message. Cette commande est complexe et est décrite plus en détail [Gründer Chatbot|ici].&lt;br /&gt;
&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random min max !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande génère un nombre entier compris entre min (inclus) et max (exclu), et place le résultat dans $0.&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!repeat n !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande répète n fois la commande. Elle place le numéro de l'itération (de 0 à n-1) dans $0.&lt;br /&gt;
'''Remarque''' : Si la commande est un texte à envoyer dans le chat, n est limité à 6, pour éviter spam. Faites toujours très attention avec cette commande, puisqu'elle pourrait bien faire crasher le bot...&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=183</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=183"/>
				<updated>2018-10-20T12:55:11Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Les commandes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|758ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro add nom !commande à executer&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro exec nom param0 param1 param2 etc...&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;!macro delete nom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La syntaxe 1 permet d'ajouter une macro nommée &amp;quot;nom&amp;quot;. Lorsqu'elle est appelée, $0 sera remplacé par le premier paramètre, $1 par le deuxième, etc...&lt;br /&gt;
La syntaxe 2 permet d'appeler une macro nommée &amp;quot;nom&amp;quot;.&lt;br /&gt;
La syntaxe 3 permet de supprimer la macron &amp;quot;nom&amp;quot;.&lt;br /&gt;
'''Remarque''' : Les macro sont sauvegardées (et donc persistantes au redémarrage de Gründer).&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math a opérateur b !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fait un calcul, et appel la commande à exécuter en plaçant le résultat du calcul dans $0. Voici les opérateurs supportés :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opérateur&lt;br /&gt;
!Opération&lt;br /&gt;
|-&lt;br /&gt;
| +&lt;br /&gt;
|Additionne a et b&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
|Soustrait b à a&lt;br /&gt;
|-&lt;br /&gt;
| *&lt;br /&gt;
|Multiplie a et b&lt;br /&gt;
|-&lt;br /&gt;
| /&lt;br /&gt;
|Divise a par b&lt;br /&gt;
|-&lt;br /&gt;
| %&lt;br /&gt;
|Calcule le reste de la division de a par b&lt;br /&gt;
|-&lt;br /&gt;
| ^&lt;br /&gt;
|Calcule a puissance b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : un &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; peut être accolé à l'opérateur pour caster le résultat en un entier. Par exemple :&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 / 2&amp;lt;/code&amp;gt; retournera 0.5&lt;br /&gt;
* &amp;lt;code&amp;gt;!math 1 /i 2&amp;lt;/code&amp;gt; retournera 0&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=182</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=182"/>
				<updated>2018-10-20T12:44:31Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Les commandes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|75ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=181</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=181"/>
				<updated>2018-10-20T12:44:09Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Les commandes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!if===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!if cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument, à moins que 'cond' ne soit 0, false, ou vide.&lt;br /&gt;
&lt;br /&gt;
===!ifelse===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;§ifelse cond, !commande si vrai, !commande si faux&lt;br /&gt;
&lt;br /&gt;
Si 'cond' est 0, false, ou est vide, alors &amp;lt;code&amp;gt;!commande si faux&amp;lt;/code&amp;gt; sera exécuté. Sinon, &amp;lt;code&amp;gt;!commande si vrai&amp;lt;/code&amp;gt; sera lancé.&lt;br /&gt;
&lt;br /&gt;
===!ifnot===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!ifnot cond !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument uniquement si 'cond' est soit 0, false, ou est vide.&lt;br /&gt;
&lt;br /&gt;
===!in===&lt;br /&gt;
Syntaxe :&lt;br /&gt;
* &amp;lt;code&amp;gt;!in temps(ms|s|m|h) !commande à exécuter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exécutera la commande passée en argument après que le temps indiqué soit écoulé. Le temps doit être un nombre '''entier''' suivi d'une unité accolée. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|75ms&lt;br /&gt;
|758 millisecondes&lt;br /&gt;
|-&lt;br /&gt;
|3s&lt;br /&gt;
|3 secondes&lt;br /&gt;
|-&lt;br /&gt;
|12m&lt;br /&gt;
|12 minutes&lt;br /&gt;
|-&lt;br /&gt;
|2h&lt;br /&gt;
|2 heures&lt;br /&gt;
|-&lt;br /&gt;
|13 s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: l'espace ne doit pas être présent&lt;br /&gt;
|-&lt;br /&gt;
|7.0s&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;INVALIDE&amp;lt;/span&amp;gt;: même si la partie fractionnelle est nulle, 7.0 n'est pas considéré comme un nombre entier.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===!macro===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===!math===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===!random===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
===!repeat===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=180</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=180"/>
				<updated>2018-10-20T12:25:53Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt; ''(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;invalide&amp;lt;/span&amp;gt;)''&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!in===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=179</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=179"/>
				<updated>2018-10-20T12:22:17Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [[Gründer Chatbot|!chatbot]], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [[Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot]] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!in===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=178</id>
		<title>Gründer Scripting</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Scripting&amp;diff=178"/>
				<updated>2018-10-20T12:21:49Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: Created page with &amp;quot;Pour pouvoir réaliser plus de trucs avec [Gründer Chatbot|!chatbot], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.  ==Princi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour pouvoir réaliser plus de trucs avec [Gründer Chatbot|!chatbot], j'ai ajouté quelques commandes dont la syntaxe est '''hyper chiante''', alors accrochez vous.&lt;br /&gt;
&lt;br /&gt;
==Principes de bases==&lt;br /&gt;
Tout d'abord, il y a deux principes de base qui sont valides pour toute commande : le premier concerne l'accumulation de commande, et le deuxième porte sur les arguments.&lt;br /&gt;
&lt;br /&gt;
===Accumulation de commandes===&lt;br /&gt;
Dans cet article seront décrite plusieurs commandes qui, après avoir fait quelque chose, lanceront une '''autre''' commande. Cette '''autre''' commande doit être passée en argument à la première commande. Prenons l'exemple de la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; qui exécute la dite '''autre''' commande après un temps donné :&lt;br /&gt;
* &amp;lt;code&amp;gt;§in 5s, !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande jouera le fameux &amp;quot;AH !&amp;quot; de Denis 5 secondes après qu'elle ait été envoyée. On utilise ici le § parce-que le 2ème argument de &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; est la commande à lancer après le temps donné. Mais cela '''n'est pas nécessaire'''; en effet : la commande &amp;lt;code&amp;gt;!in&amp;lt;/code&amp;gt; ne s’attend à rien d'autre que le temps et la commande ! Par conséquent, on peut très bien utiliser '!' à la place de '§' puisque tout ce qui est après le temps sera concaténé. Donc,&lt;br /&gt;
* &amp;lt;code&amp;gt;!in 5s !am db_ah&amp;lt;/code&amp;gt;&lt;br /&gt;
aura le même effet, et est plus simple à lire. En revanche, cela n'est plus valide pour une commande telle que &amp;lt;code&amp;gt;!script&amp;lt;/code&amp;gt;, qui exécute tour à tour les commande qui lui sont passées en argument :&lt;br /&gt;
* &amp;lt;code&amp;gt;§script !am db_ah, !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Ceci exécutera &amp;lt;code&amp;gt;!am db_ah&amp;lt;/code&amp;gt; puis &amp;lt;code&amp;gt;!am r_issou&amp;lt;/code&amp;gt;. Ici, évidemment, on est obligé d'utiliser §, sans quoi !script ne saura pas faire la séparation entre les commandes à lancer.&lt;br /&gt;
* &amp;lt;code&amp;gt;!script !am db_ah !am r_issou&amp;lt;/code&amp;gt;&lt;br /&gt;
Aura pour effet :&lt;br /&gt;
# De lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera une erreur)&lt;br /&gt;
# D'écrire dans le chat 'db_ah'&lt;br /&gt;
# De re-lancer &amp;lt;code&amp;gt;!am&amp;lt;/code&amp;gt; sans argument (causera à nouveau une erreur)&lt;br /&gt;
# D'écrire dans le chat 'r_issou'&lt;br /&gt;
&lt;br /&gt;
===Les tokens $x, x étant un chiffre===&lt;br /&gt;
Vous vous souvenez de la commande [Gründer Chatbot#Le token $x, x étant un chiffre|!chatbot] qui remplaçait $0, $1, etc... par les groupes capturés par l'expression régulière ? Ce système de &amp;quot;remplaçage&amp;quot; ne lui est pas propre. D'autres commande se servent de ce mécanisme pour faire passer des valeurs quelconques aux commandes qu'elles exécutent. Prenons &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt; :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 Le résultat est $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Cette commande génère un nombre entier entre 1 (inclus) et 6 (exclu), puis appelle la commande donnée. Ici, il ne s'agît pas d'une commande mais d'un message dans le chat, peu importe : le résultat est que $0 sera remplacé par le résultat de la commande &amp;lt;code&amp;gt;!random&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais que se passe-t-il lorsque l'on accumule plusieurs commandes qui ont &amp;quot;une valeur de retour&amp;quot; ?&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
Les deux nombre seront toujours les mêmes. Que se passe-t-il ?&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard, notons la x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième x&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (juste envoyer un message), elle remplace tous les $0 par y. Problème : il n'y a pas d’occurrence de $0. Donc, rien ne sera changé, et 'Le premier nombre est x et le deuxième x' sera envoyé dans le chat.&lt;br /&gt;
&lt;br /&gt;
Pour y remédier, il faut '''échapper''' le second $0 :&lt;br /&gt;
* &amp;lt;code&amp;gt;!random 1 6 !random 1 6 Le premier nombre est $0 et le deuxième $$0&amp;lt;/code&amp;gt;&lt;br /&gt;
Là, ça marche. Détaillons tout de même ce qui se passe :&lt;br /&gt;
# La première commande est exécutée. Elle choisi un nombre au hasard x.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter, elle remplace tous les $0 par x '''sauf ceux qui sont échappés'''. Ainsi, la commande sera &amp;lt;code&amp;gt;!random 1 6 Le premier nombre est x et le deuxième $0&amp;lt;/code&amp;gt;&lt;br /&gt;
# La deuxième commande est exécutée. Elle choisi le nombre y.&lt;br /&gt;
# Dans la commande qu'elle se doit d'exécuter (le message), elle remplace tous les $0 par y. On aura donc 'Le premier nombre est x et le deuxième y' comme on s'y attendait.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Les commandes==&lt;br /&gt;
===!in===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Chatbot&amp;diff=177</id>
		<title>Gründer Chatbot</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Chatbot&amp;diff=177"/>
				<updated>2018-10-20T11:23:33Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Dabber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le commande Chatbot permet de faire réagir Gründer lors de la réception d'un message. Pour détecter un message, !chatbot dispose de 3 mode de détection (whole, find_once et find_multi) ainsi que 2 mécanismes de détection : comparaison de chaîne ou expression régulière. Lorsqu'un message correspondant aux critères précédent est détecté, il peut réagir de deux manières : en envoyant un message ou en exécutant une commande. Chaque couple action/réaction possède un nom que vous lui attribuerez. Il sert notamment à supprimer le couple si besoin.&lt;br /&gt;
&lt;br /&gt;
==Paramètres principaux==&lt;br /&gt;
* Ajouter un couple action/réaction: &amp;lt;code&amp;gt;!chatbot name mode pattern whatToSay1 [whatToSay2 ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Supprimer un couple: &amp;lt;code&amp;gt;!chatbot delete name&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mode===&lt;br /&gt;
Ce paramètre peut prendre 3 valeurs:&lt;br /&gt;
* whole: le pattern doit matcher l'entièreté du message.&lt;br /&gt;
* find_once: le pattern peut se trouver n'importe où dans le message. La réaction ne sera réalisée qu'une fois, même si le pattern est trouvé à plusieurs endroits.&lt;br /&gt;
* find_multi: le pattern peut se trouver n'importe où dans le message. La réaction sera réalisée une fois par occurrence du pattern.&lt;br /&gt;
&lt;br /&gt;
===pattern===&lt;br /&gt;
Ce paramètre peut être soit une chaîne de caractère normale, soit une expression régulière. Si il contient un slash au début et à la fin, il sera considéré comme un expression régulière. Sinon, il sera considéré comme un chaîne de caractère simple. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|jaaj&lt;br /&gt;
|chaîne de caractères&lt;br /&gt;
|-&lt;br /&gt;
|/jaaj&lt;br /&gt;
|chaîne de caractères&lt;br /&gt;
|-&lt;br /&gt;
|/test/&lt;br /&gt;
|regexp&lt;br /&gt;
|-&lt;br /&gt;
|/test/i&lt;br /&gt;
|regexp avec flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Chaine de caractères====&lt;br /&gt;
En gros, c'est un CTRL+F dans le message. Si ce texte est trouvé, il exécutera la réaction; et sinon, rien. A noter que la recherche se fait '''en ignorant la casse'''.&lt;br /&gt;
&lt;br /&gt;
====Regexp====&lt;br /&gt;
La syntaxe de la regexp (la partie entre les slashs) peut se trouver sur la doc Java : [https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum java.util.regex.Pattern] Le caractère (optionnel) se trouvant après le slash fermant la regexp '''est un flag'''. Il ajoute des informations supplémentaires sur comment la regexp doit être traitée. Gründer ne supporte (pour l'instant) qu'un seul flag: &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Lorsqu'il est présent, il indique que l'expression régulière est insensible à la casse. Pour tester vos regexp, je vous recommande l'excellent site [https://regex101.com/ Regex101].&lt;br /&gt;
&lt;br /&gt;
==Les réactions==&lt;br /&gt;
Lorsque plusieurs réactions sont précisées, Gründer choisira au hasard parmi les réactions proposées. Une réaction peut être soit un message à envoyer, soit une commande à executer; si ce paramètre commence par ! ou §, c'est une commande, et sinon c'est un message.&lt;br /&gt;
&lt;br /&gt;
===Le token $@===&lt;br /&gt;
Toute les occurrences de $@ seront remplacés par une mention de l'auteur du message qui a matché avec le pattern donné.&lt;br /&gt;
&lt;br /&gt;
===Le token $x, x étant un chiffre===&lt;br /&gt;
Dans le cas où pattern est une expression régulière, il est possible d'utiliser les &amp;quot;captures&amp;quot; (ou groupes) dans l'expression régulière (c'est ce qui est entre parenthèses, cf la doc java). Ainsi, si la réaction contient un $ suivi d'un chiffre, il sera remplacé par le contenu du groupe identifié par ce chiffre ($1 sera remplacé par le premier groupe, $2 par le 2ème etc...). Il existe aussi le groupe 0 ($0), qui est toujours présent, qui contient l'entièreté du match.&lt;br /&gt;
&lt;br /&gt;
===Échappement des tokens===&lt;br /&gt;
Il est bien évidemment possible d'échapper le symbole $ si vous ne voulez pas qu'il soit remplacé. Mettez simplement deux $ d'affilés. Exemple: &amp;lt;code&amp;gt;$$1&amp;lt;/code&amp;gt; ne sera pas remplacé par &amp;lt;code&amp;gt;$groupe1&amp;lt;/code&amp;gt; mais par &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Remarque sur les commandes===&lt;br /&gt;
Ne vous faites pas avoir par les espaces. Si vous appelez !chatbot avec le '!' (et non le '§'), les paramètres sont séparé par des espaces. Ainsi, &amp;lt;code&amp;gt;!chatbot casse find_once test !insulter Vincent&amp;lt;/code&amp;gt; '''n'insultera pas Vincent''' mais aura une chance sur 2 de lancer la commande &amp;lt;code&amp;gt;!insulter&amp;lt;/code&amp;gt; ou d'envoyer le message &amp;lt;code&amp;gt;Vincent&amp;lt;/code&amp;gt; lorsque &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; est détecté dans un message. Pour régler ce problème, il faut bien évidemment utiliser '§' de cette manière : &amp;lt;code&amp;gt;§chatbot passe, find_once, test, !insulter Vincent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La vraie question est alors, comment faire si la commande que je dois appeler requiert elle aussi l'utilisation de '§' ? Marine dirait: &amp;quot;euuuh, nique ta mère&amp;quot;. Mais je ne suis pas Marine et il existe une solution: échapper '§' et ',' avec un autre '§'. Démonstration : &amp;lt;code&amp;gt;§chatbot test, find_once, test, §§ma_commande paramètre 1 §, paramètre 2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Exemples==&lt;br /&gt;
===Répondre bonjour===&lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot bonjour whole bonjour Bonjour&amp;lt;/code&amp;gt;: lorsque quelqu'un envoie &amp;quot;Bonjour&amp;quot;, Gründer répondra &amp;quot;Bonjour&amp;quot;&lt;br /&gt;
Bon, on est d'accord, c'est nul. Il pourrait au moins pas dire tout le temps la même chose : &lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot bonjour whole bonjour Bonjour Yo Salut Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est mieux, mais on pourrait aller plus loin. Ca serait bien de dire le nom de la personne à qui ont dit Bonjour :&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot bonjour, whole, bonjour, Bonjour, Yo $@, Salut $@, Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
Mieux. Mais si ont dit salut à la place de bonjour, mon truc est niqué. Je vous propose donc :&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot bonjour, whole, /^(Bonjour|Yo|Salut|Hey+)(\s+Olivier)?(\s+Gr[uü]nder)?$/i, Bonjour, Yo $@, Salut $@, Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Trouver quelqu'un===&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot trouver, whole, /^(?:Olivier|Gr[uü]nder)\s+trouve\s(.+)$/i, !trouver $1&amp;lt;/code&amp;gt;&lt;br /&gt;
Si je dis &amp;quot;Olivier trouve le respect&amp;quot;, il lancera la commande !trouver avec comme premier argument le premier groupe capturé, soit &amp;quot;le respect&amp;quot;. On remarquera la présence de '?:' dans les premières parenthèses. Cela indique à Java de ne pas considérer ce qu'il y a entre parenthèses comme un groupe. Si ces caractères n'étaient pas présents, alors le premier groupe ne serait pas &amp;quot;le respect&amp;quot; mais &amp;quot;Olivier&amp;quot;. On aurait aussi pu utiliser $2 au lieu de $1...&lt;br /&gt;
&lt;br /&gt;
===Dabber===&lt;br /&gt;
(Bon, j'avais vraiment pas d'exemple... désolé...)&lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot dab find_multi dab :dab:&amp;lt;/code&amp;gt;&lt;br /&gt;
Si je dis &amp;quot;allons dabber sur les haters vive le dab&amp;quot;, Gründer enverra deux messages avec l'émoji dab. Voilà, c'est de la grosse merde, faites en ce que vous voulez...&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez cependant qu'on ne cherche pas '''le mot''' dab, mais la présence de 'd', suivi de 'a', suivi de 'b' dans '''tout le message'''. Ainsi, le pattern matchera si votre message contient 'abracadabra'. Si vous souhaitez bel et bien matcher '''le mot''' dab, alors il faudra utiliser la regexp &amp;lt;code&amp;gt;/\bdab\b/&amp;lt;/code&amp;gt;. On notera la présence de '\b' avant et après dab, qui signifient &amp;quot;break&amp;quot;. Un break est soit un espace, soit le début ou la fin du message. C'est donc tout à fait ce que nous voulons.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Chatbot&amp;diff=176</id>
		<title>Gründer Chatbot</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Chatbot&amp;diff=176"/>
				<updated>2018-10-20T11:22:20Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Dabber */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le commande Chatbot permet de faire réagir Gründer lors de la réception d'un message. Pour détecter un message, !chatbot dispose de 3 mode de détection (whole, find_once et find_multi) ainsi que 2 mécanismes de détection : comparaison de chaîne ou expression régulière. Lorsqu'un message correspondant aux critères précédent est détecté, il peut réagir de deux manières : en envoyant un message ou en exécutant une commande. Chaque couple action/réaction possède un nom que vous lui attribuerez. Il sert notamment à supprimer le couple si besoin.&lt;br /&gt;
&lt;br /&gt;
==Paramètres principaux==&lt;br /&gt;
* Ajouter un couple action/réaction: &amp;lt;code&amp;gt;!chatbot name mode pattern whatToSay1 [whatToSay2 ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Supprimer un couple: &amp;lt;code&amp;gt;!chatbot delete name&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mode===&lt;br /&gt;
Ce paramètre peut prendre 3 valeurs:&lt;br /&gt;
* whole: le pattern doit matcher l'entièreté du message.&lt;br /&gt;
* find_once: le pattern peut se trouver n'importe où dans le message. La réaction ne sera réalisée qu'une fois, même si le pattern est trouvé à plusieurs endroits.&lt;br /&gt;
* find_multi: le pattern peut se trouver n'importe où dans le message. La réaction sera réalisée une fois par occurrence du pattern.&lt;br /&gt;
&lt;br /&gt;
===pattern===&lt;br /&gt;
Ce paramètre peut être soit une chaîne de caractère normale, soit une expression régulière. Si il contient un slash au début et à la fin, il sera considéré comme un expression régulière. Sinon, il sera considéré comme un chaîne de caractère simple. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|jaaj&lt;br /&gt;
|chaîne de caractères&lt;br /&gt;
|-&lt;br /&gt;
|/jaaj&lt;br /&gt;
|chaîne de caractères&lt;br /&gt;
|-&lt;br /&gt;
|/test/&lt;br /&gt;
|regexp&lt;br /&gt;
|-&lt;br /&gt;
|/test/i&lt;br /&gt;
|regexp avec flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Chaine de caractères====&lt;br /&gt;
En gros, c'est un CTRL+F dans le message. Si ce texte est trouvé, il exécutera la réaction; et sinon, rien. A noter que la recherche se fait '''en ignorant la casse'''.&lt;br /&gt;
&lt;br /&gt;
====Regexp====&lt;br /&gt;
La syntaxe de la regexp (la partie entre les slashs) peut se trouver sur la doc Java : [https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum java.util.regex.Pattern] Le caractère (optionnel) se trouvant après le slash fermant la regexp '''est un flag'''. Il ajoute des informations supplémentaires sur comment la regexp doit être traitée. Gründer ne supporte (pour l'instant) qu'un seul flag: &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Lorsqu'il est présent, il indique que l'expression régulière est insensible à la casse. Pour tester vos regexp, je vous recommande l'excellent site [https://regex101.com/ Regex101].&lt;br /&gt;
&lt;br /&gt;
==Les réactions==&lt;br /&gt;
Lorsque plusieurs réactions sont précisées, Gründer choisira au hasard parmi les réactions proposées. Une réaction peut être soit un message à envoyer, soit une commande à executer; si ce paramètre commence par ! ou §, c'est une commande, et sinon c'est un message.&lt;br /&gt;
&lt;br /&gt;
===Le token $@===&lt;br /&gt;
Toute les occurrences de $@ seront remplacés par une mention de l'auteur du message qui a matché avec le pattern donné.&lt;br /&gt;
&lt;br /&gt;
===Le token $x, x étant un chiffre===&lt;br /&gt;
Dans le cas où pattern est une expression régulière, il est possible d'utiliser les &amp;quot;captures&amp;quot; (ou groupes) dans l'expression régulière (c'est ce qui est entre parenthèses, cf la doc java). Ainsi, si la réaction contient un $ suivi d'un chiffre, il sera remplacé par le contenu du groupe identifié par ce chiffre ($1 sera remplacé par le premier groupe, $2 par le 2ème etc...). Il existe aussi le groupe 0 ($0), qui est toujours présent, qui contient l'entièreté du match.&lt;br /&gt;
&lt;br /&gt;
===Échappement des tokens===&lt;br /&gt;
Il est bien évidemment possible d'échapper le symbole $ si vous ne voulez pas qu'il soit remplacé. Mettez simplement deux $ d'affilés. Exemple: &amp;lt;code&amp;gt;$$1&amp;lt;/code&amp;gt; ne sera pas remplacé par &amp;lt;code&amp;gt;$groupe1&amp;lt;/code&amp;gt; mais par &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Remarque sur les commandes===&lt;br /&gt;
Ne vous faites pas avoir par les espaces. Si vous appelez !chatbot avec le '!' (et non le '§'), les paramètres sont séparé par des espaces. Ainsi, &amp;lt;code&amp;gt;!chatbot casse find_once test !insulter Vincent&amp;lt;/code&amp;gt; '''n'insultera pas Vincent''' mais aura une chance sur 2 de lancer la commande &amp;lt;code&amp;gt;!insulter&amp;lt;/code&amp;gt; ou d'envoyer le message &amp;lt;code&amp;gt;Vincent&amp;lt;/code&amp;gt; lorsque &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; est détecté dans un message. Pour régler ce problème, il faut bien évidemment utiliser '§' de cette manière : &amp;lt;code&amp;gt;§chatbot passe, find_once, test, !insulter Vincent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La vraie question est alors, comment faire si la commande que je dois appeler requiert elle aussi l'utilisation de '§' ? Marine dirait: &amp;quot;euuuh, nique ta mère&amp;quot;. Mais je ne suis pas Marine et il existe une solution: échapper '§' et ',' avec un autre '§'. Démonstration : &amp;lt;code&amp;gt;§chatbot test, find_once, test, §§ma_commande paramètre 1 §, paramètre 2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Exemples==&lt;br /&gt;
===Répondre bonjour===&lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot bonjour whole bonjour Bonjour&amp;lt;/code&amp;gt;: lorsque quelqu'un envoie &amp;quot;Bonjour&amp;quot;, Gründer répondra &amp;quot;Bonjour&amp;quot;&lt;br /&gt;
Bon, on est d'accord, c'est nul. Il pourrait au moins pas dire tout le temps la même chose : &lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot bonjour whole bonjour Bonjour Yo Salut Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est mieux, mais on pourrait aller plus loin. Ca serait bien de dire le nom de la personne à qui ont dit Bonjour :&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot bonjour, whole, bonjour, Bonjour, Yo $@, Salut $@, Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
Mieux. Mais si ont dit salut à la place de bonjour, mon truc est niqué. Je vous propose donc :&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot bonjour, whole, /^(Bonjour|Yo|Salut|Hey+)(\s+Olivier)?(\s+Gr[uü]nder)?$/i, Bonjour, Yo $@, Salut $@, Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Trouver quelqu'un===&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot trouver, whole, /^(?:Olivier|Gr[uü]nder)\s+trouve\s(.+)$/i, !trouver $1&amp;lt;/code&amp;gt;&lt;br /&gt;
Si je dis &amp;quot;Olivier trouve le respect&amp;quot;, il lancera la commande !trouver avec comme premier argument le premier groupe capturé, soit &amp;quot;le respect&amp;quot;. On remarquera la présence de '?:' dans les premières parenthèses. Cela indique à Java de ne pas considérer ce qu'il y a entre parenthèses comme un groupe. Si ces caractères n'étaient pas présents, alors le premier groupe ne serait pas &amp;quot;le respect&amp;quot; mais &amp;quot;Olivier&amp;quot;. On aurait aussi pu utiliser $2 au lieu de $1...&lt;br /&gt;
&lt;br /&gt;
===Dabber===&lt;br /&gt;
(Bon, j'avais vraiment pas d'exemple... désolé...)&lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot dab find_multi dab :dab:&amp;lt;/code&amp;gt;&lt;br /&gt;
Si je dis &amp;quot;allons dabber sur hater vive le dab&amp;quot;, Gründer enverra deux messages avec l'émoji dab. Voilà, c'est de la grosse merde, faites en ce que vous voulez...&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez cependant qu'on ne cherche pas '''le mot''' dab, mais la présence de d suivi de a suivi de b dans '''tout le message'''. Ainsi, le pattern matchera si votre message contient 'abracadabra'. Si vous souhaitez bel et bien matcher '''le mot''' dab, alors il faudra utiliser la regexp &amp;lt;code&amp;gt;/\bdab\b/&amp;lt;/code&amp;gt;. On notera la présence de '\b' avant et après dab, qui signifient &amp;quot;break&amp;quot;. Un break est soit un espace, soit le début ou la fin du message. C'est donc tout à fait ce que nous voulons.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Chatbot&amp;diff=175</id>
		<title>Gründer Chatbot</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Chatbot&amp;diff=175"/>
				<updated>2018-10-20T11:21:55Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Trouver quelqu'un */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le commande Chatbot permet de faire réagir Gründer lors de la réception d'un message. Pour détecter un message, !chatbot dispose de 3 mode de détection (whole, find_once et find_multi) ainsi que 2 mécanismes de détection : comparaison de chaîne ou expression régulière. Lorsqu'un message correspondant aux critères précédent est détecté, il peut réagir de deux manières : en envoyant un message ou en exécutant une commande. Chaque couple action/réaction possède un nom que vous lui attribuerez. Il sert notamment à supprimer le couple si besoin.&lt;br /&gt;
&lt;br /&gt;
==Paramètres principaux==&lt;br /&gt;
* Ajouter un couple action/réaction: &amp;lt;code&amp;gt;!chatbot name mode pattern whatToSay1 [whatToSay2 ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Supprimer un couple: &amp;lt;code&amp;gt;!chatbot delete name&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mode===&lt;br /&gt;
Ce paramètre peut prendre 3 valeurs:&lt;br /&gt;
* whole: le pattern doit matcher l'entièreté du message.&lt;br /&gt;
* find_once: le pattern peut se trouver n'importe où dans le message. La réaction ne sera réalisée qu'une fois, même si le pattern est trouvé à plusieurs endroits.&lt;br /&gt;
* find_multi: le pattern peut se trouver n'importe où dans le message. La réaction sera réalisée une fois par occurrence du pattern.&lt;br /&gt;
&lt;br /&gt;
===pattern===&lt;br /&gt;
Ce paramètre peut être soit une chaîne de caractère normale, soit une expression régulière. Si il contient un slash au début et à la fin, il sera considéré comme un expression régulière. Sinon, il sera considéré comme un chaîne de caractère simple. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|jaaj&lt;br /&gt;
|chaîne de caractères&lt;br /&gt;
|-&lt;br /&gt;
|/jaaj&lt;br /&gt;
|chaîne de caractères&lt;br /&gt;
|-&lt;br /&gt;
|/test/&lt;br /&gt;
|regexp&lt;br /&gt;
|-&lt;br /&gt;
|/test/i&lt;br /&gt;
|regexp avec flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Chaine de caractères====&lt;br /&gt;
En gros, c'est un CTRL+F dans le message. Si ce texte est trouvé, il exécutera la réaction; et sinon, rien. A noter que la recherche se fait '''en ignorant la casse'''.&lt;br /&gt;
&lt;br /&gt;
====Regexp====&lt;br /&gt;
La syntaxe de la regexp (la partie entre les slashs) peut se trouver sur la doc Java : [https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum java.util.regex.Pattern] Le caractère (optionnel) se trouvant après le slash fermant la regexp '''est un flag'''. Il ajoute des informations supplémentaires sur comment la regexp doit être traitée. Gründer ne supporte (pour l'instant) qu'un seul flag: &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Lorsqu'il est présent, il indique que l'expression régulière est insensible à la casse. Pour tester vos regexp, je vous recommande l'excellent site [https://regex101.com/ Regex101].&lt;br /&gt;
&lt;br /&gt;
==Les réactions==&lt;br /&gt;
Lorsque plusieurs réactions sont précisées, Gründer choisira au hasard parmi les réactions proposées. Une réaction peut être soit un message à envoyer, soit une commande à executer; si ce paramètre commence par ! ou §, c'est une commande, et sinon c'est un message.&lt;br /&gt;
&lt;br /&gt;
===Le token $@===&lt;br /&gt;
Toute les occurrences de $@ seront remplacés par une mention de l'auteur du message qui a matché avec le pattern donné.&lt;br /&gt;
&lt;br /&gt;
===Le token $x, x étant un chiffre===&lt;br /&gt;
Dans le cas où pattern est une expression régulière, il est possible d'utiliser les &amp;quot;captures&amp;quot; (ou groupes) dans l'expression régulière (c'est ce qui est entre parenthèses, cf la doc java). Ainsi, si la réaction contient un $ suivi d'un chiffre, il sera remplacé par le contenu du groupe identifié par ce chiffre ($1 sera remplacé par le premier groupe, $2 par le 2ème etc...). Il existe aussi le groupe 0 ($0), qui est toujours présent, qui contient l'entièreté du match.&lt;br /&gt;
&lt;br /&gt;
===Échappement des tokens===&lt;br /&gt;
Il est bien évidemment possible d'échapper le symbole $ si vous ne voulez pas qu'il soit remplacé. Mettez simplement deux $ d'affilés. Exemple: &amp;lt;code&amp;gt;$$1&amp;lt;/code&amp;gt; ne sera pas remplacé par &amp;lt;code&amp;gt;$groupe1&amp;lt;/code&amp;gt; mais par &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Remarque sur les commandes===&lt;br /&gt;
Ne vous faites pas avoir par les espaces. Si vous appelez !chatbot avec le '!' (et non le '§'), les paramètres sont séparé par des espaces. Ainsi, &amp;lt;code&amp;gt;!chatbot casse find_once test !insulter Vincent&amp;lt;/code&amp;gt; '''n'insultera pas Vincent''' mais aura une chance sur 2 de lancer la commande &amp;lt;code&amp;gt;!insulter&amp;lt;/code&amp;gt; ou d'envoyer le message &amp;lt;code&amp;gt;Vincent&amp;lt;/code&amp;gt; lorsque &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; est détecté dans un message. Pour régler ce problème, il faut bien évidemment utiliser '§' de cette manière : &amp;lt;code&amp;gt;§chatbot passe, find_once, test, !insulter Vincent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La vraie question est alors, comment faire si la commande que je dois appeler requiert elle aussi l'utilisation de '§' ? Marine dirait: &amp;quot;euuuh, nique ta mère&amp;quot;. Mais je ne suis pas Marine et il existe une solution: échapper '§' et ',' avec un autre '§'. Démonstration : &amp;lt;code&amp;gt;§chatbot test, find_once, test, §§ma_commande paramètre 1 §, paramètre 2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Exemples==&lt;br /&gt;
===Répondre bonjour===&lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot bonjour whole bonjour Bonjour&amp;lt;/code&amp;gt;: lorsque quelqu'un envoie &amp;quot;Bonjour&amp;quot;, Gründer répondra &amp;quot;Bonjour&amp;quot;&lt;br /&gt;
Bon, on est d'accord, c'est nul. Il pourrait au moins pas dire tout le temps la même chose : &lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot bonjour whole bonjour Bonjour Yo Salut Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est mieux, mais on pourrait aller plus loin. Ca serait bien de dire le nom de la personne à qui ont dit Bonjour :&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot bonjour, whole, bonjour, Bonjour, Yo $@, Salut $@, Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
Mieux. Mais si ont dit salut à la place de bonjour, mon truc est niqué. Je vous propose donc :&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot bonjour, whole, /^(Bonjour|Yo|Salut|Hey+)(\s+Olivier)?(\s+Gr[uü]nder)?$/i, Bonjour, Yo $@, Salut $@, Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Trouver quelqu'un===&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot trouver, whole, /^(?:Olivier|Gr[uü]nder)\s+trouve\s(.+)$/i, !trouver $1&amp;lt;/code&amp;gt;&lt;br /&gt;
Si je dis &amp;quot;Olivier trouve le respect&amp;quot;, il lancera la commande !trouver avec comme premier argument le premier groupe capturé, soit &amp;quot;le respect&amp;quot;. On remarquera la présence de '?:' dans les premières parenthèses. Cela indique à Java de ne pas considérer ce qu'il y a entre parenthèses comme un groupe. Si ces caractères n'étaient pas présents, alors le premier groupe ne serait pas &amp;quot;le respect&amp;quot; mais &amp;quot;Olivier&amp;quot;. On aurait aussi pu utiliser $2 au lieu de $1...&lt;br /&gt;
&lt;br /&gt;
===Dabber===&lt;br /&gt;
(Bon, j'avais vraiment pas d'exemple... désolé...)&lt;br /&gt;
* !chatbot dab find_multi dab :dab:&lt;br /&gt;
Si je dis &amp;quot;allons dabber sur hater vive le dab&amp;quot;, Gründer enverra deux messages avec l'émoji dab. Voilà, c'est de la grosse merde, faites en ce que vous voulez...&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez cependant qu'on ne cherche pas '''le mot''' dab, mais la présence de d suivi de a suivi de b dans '''tout le message'''. Ainsi, le pattern matchera si votre message contient 'abracadabra'. Si vous souhaitez bel et bien matcher '''le mot''' dab, alors il faudra utiliser la regexp &amp;lt;code&amp;gt;/\bdab\b/&amp;lt;/code&amp;gt;. On notera la présence de '\b' avant et après dab, qui signifient &amp;quot;break&amp;quot;. Un break est soit un espace, soit le début ou la fin du message. C'est donc tout à fait ce que nous voulons.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Chatbot&amp;diff=174</id>
		<title>Gründer Chatbot</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Gr%C3%BCnder_Chatbot&amp;diff=174"/>
				<updated>2018-10-20T11:19:25Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: Created page with &amp;quot;Le commande Chatbot permet de faire réagir Gründer lors de la réception d'un message. Pour détecter un message, !chatbot dispose de 3 mode de détection (whole, find_once...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Le commande Chatbot permet de faire réagir Gründer lors de la réception d'un message. Pour détecter un message, !chatbot dispose de 3 mode de détection (whole, find_once et find_multi) ainsi que 2 mécanismes de détection : comparaison de chaîne ou expression régulière. Lorsqu'un message correspondant aux critères précédent est détecté, il peut réagir de deux manières : en envoyant un message ou en exécutant une commande. Chaque couple action/réaction possède un nom que vous lui attribuerez. Il sert notamment à supprimer le couple si besoin.&lt;br /&gt;
&lt;br /&gt;
==Paramètres principaux==&lt;br /&gt;
* Ajouter un couple action/réaction: &amp;lt;code&amp;gt;!chatbot name mode pattern whatToSay1 [whatToSay2 ...]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Supprimer un couple: &amp;lt;code&amp;gt;!chatbot delete name&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===mode===&lt;br /&gt;
Ce paramètre peut prendre 3 valeurs:&lt;br /&gt;
* whole: le pattern doit matcher l'entièreté du message.&lt;br /&gt;
* find_once: le pattern peut se trouver n'importe où dans le message. La réaction ne sera réalisée qu'une fois, même si le pattern est trouvé à plusieurs endroits.&lt;br /&gt;
* find_multi: le pattern peut se trouver n'importe où dans le message. La réaction sera réalisée une fois par occurrence du pattern.&lt;br /&gt;
&lt;br /&gt;
===pattern===&lt;br /&gt;
Ce paramètre peut être soit une chaîne de caractère normale, soit une expression régulière. Si il contient un slash au début et à la fin, il sera considéré comme un expression régulière. Sinon, il sera considéré comme un chaîne de caractère simple. Exemples :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Texte&lt;br /&gt;
!Interprétation&lt;br /&gt;
|-&lt;br /&gt;
|jaaj&lt;br /&gt;
|chaîne de caractères&lt;br /&gt;
|-&lt;br /&gt;
|/jaaj&lt;br /&gt;
|chaîne de caractères&lt;br /&gt;
|-&lt;br /&gt;
|/test/&lt;br /&gt;
|regexp&lt;br /&gt;
|-&lt;br /&gt;
|/test/i&lt;br /&gt;
|regexp avec flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Chaine de caractères====&lt;br /&gt;
En gros, c'est un CTRL+F dans le message. Si ce texte est trouvé, il exécutera la réaction; et sinon, rien. A noter que la recherche se fait '''en ignorant la casse'''.&lt;br /&gt;
&lt;br /&gt;
====Regexp====&lt;br /&gt;
La syntaxe de la regexp (la partie entre les slashs) peut se trouver sur la doc Java : [https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum java.util.regex.Pattern] Le caractère (optionnel) se trouvant après le slash fermant la regexp '''est un flag'''. Il ajoute des informations supplémentaires sur comment la regexp doit être traitée. Gründer ne supporte (pour l'instant) qu'un seul flag: &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;. Lorsqu'il est présent, il indique que l'expression régulière est insensible à la casse. Pour tester vos regexp, je vous recommande l'excellent site [https://regex101.com/ Regex101].&lt;br /&gt;
&lt;br /&gt;
==Les réactions==&lt;br /&gt;
Lorsque plusieurs réactions sont précisées, Gründer choisira au hasard parmi les réactions proposées. Une réaction peut être soit un message à envoyer, soit une commande à executer; si ce paramètre commence par ! ou §, c'est une commande, et sinon c'est un message.&lt;br /&gt;
&lt;br /&gt;
===Le token $@===&lt;br /&gt;
Toute les occurrences de $@ seront remplacés par une mention de l'auteur du message qui a matché avec le pattern donné.&lt;br /&gt;
&lt;br /&gt;
===Le token $x, x étant un chiffre===&lt;br /&gt;
Dans le cas où pattern est une expression régulière, il est possible d'utiliser les &amp;quot;captures&amp;quot; (ou groupes) dans l'expression régulière (c'est ce qui est entre parenthèses, cf la doc java). Ainsi, si la réaction contient un $ suivi d'un chiffre, il sera remplacé par le contenu du groupe identifié par ce chiffre ($1 sera remplacé par le premier groupe, $2 par le 2ème etc...). Il existe aussi le groupe 0 ($0), qui est toujours présent, qui contient l'entièreté du match.&lt;br /&gt;
&lt;br /&gt;
===Échappement des tokens===&lt;br /&gt;
Il est bien évidemment possible d'échapper le symbole $ si vous ne voulez pas qu'il soit remplacé. Mettez simplement deux $ d'affilés. Exemple: &amp;lt;code&amp;gt;$$1&amp;lt;/code&amp;gt; ne sera pas remplacé par &amp;lt;code&amp;gt;$groupe1&amp;lt;/code&amp;gt; mais par &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Remarque sur les commandes===&lt;br /&gt;
Ne vous faites pas avoir par les espaces. Si vous appelez !chatbot avec le '!' (et non le '§'), les paramètres sont séparé par des espaces. Ainsi, &amp;lt;code&amp;gt;!chatbot casse find_once test !insulter Vincent&amp;lt;/code&amp;gt; '''n'insultera pas Vincent''' mais aura une chance sur 2 de lancer la commande &amp;lt;code&amp;gt;!insulter&amp;lt;/code&amp;gt; ou d'envoyer le message &amp;lt;code&amp;gt;Vincent&amp;lt;/code&amp;gt; lorsque &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; est détecté dans un message. Pour régler ce problème, il faut bien évidemment utiliser '§' de cette manière : &amp;lt;code&amp;gt;§chatbot passe, find_once, test, !insulter Vincent&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La vraie question est alors, comment faire si la commande que je dois appeler requiert elle aussi l'utilisation de '§' ? Marine dirait: &amp;quot;euuuh, nique ta mère&amp;quot;. Mais je ne suis pas Marine et il existe une solution: échapper '§' et ',' avec un autre '§'. Démonstration : &amp;lt;code&amp;gt;§chatbot test, find_once, test, §§ma_commande paramètre 1 §, paramètre 2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Exemples==&lt;br /&gt;
===Répondre bonjour===&lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot bonjour whole bonjour Bonjour&amp;lt;/code&amp;gt;: lorsque quelqu'un envoie &amp;quot;Bonjour&amp;quot;, Gründer répondra &amp;quot;Bonjour&amp;quot;&lt;br /&gt;
Bon, on est d'accord, c'est nul. Il pourrait au moins pas dire tout le temps la même chose : &lt;br /&gt;
* &amp;lt;code&amp;gt;!chatbot bonjour whole bonjour Bonjour Yo Salut Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
C'est mieux, mais on pourrait aller plus loin. Ca serait bien de dire le nom de la personne à qui ont dit Bonjour :&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot bonjour, whole, bonjour, Bonjour, Yo $@, Salut $@, Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
Mieux. Mais si ont dit salut à la place de bonjour, mon truc est niqué. Je vous propose donc :&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot bonjour, whole, /^(Bonjour|Yo|Salut|Hey+)(\s+Olivier)?(\s+Gr[uü]nder)?$/i, Bonjour, Yo $@, Salut $@, Heyyyy&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Trouver quelqu'un===&lt;br /&gt;
* &amp;lt;code&amp;gt;§chatbot trouver, whole, /^(?:Olivier|Gr[uü]nder)\s+trouve\s(.+)$/i, !trouver $1&amp;lt;/code&amp;gt;&lt;br /&gt;
 Si je dis &amp;quot;Olivier trouve le respect&amp;quot;, il lancera la commande !trouver avec comme premier argument le premier groupe capturé, soit &amp;quot;le respect&amp;quot;. On remarquera la présence de '?:' dans les premières parenthèses. Cela indique à Java de ne pas considérer ce qu'il y a entre parenthèses comme un groupe. Si ces caractères n'étaient pas présents, alors le premier groupe ne serait pas &amp;quot;le respect&amp;quot; mais &amp;quot;Olivier&amp;quot;. On aurait aussi pu utiliser $2 au lieu de $1...&lt;br /&gt;
&lt;br /&gt;
===Dabber===&lt;br /&gt;
(Bon, j'avais vraiment pas d'exemple... désolé...)&lt;br /&gt;
* !chatbot dab find_multi dab :dab:&lt;br /&gt;
Si je dis &amp;quot;allons dabber sur hater vive le dab&amp;quot;, Gründer enverra deux messages avec l'émoji dab. Voilà, c'est de la grosse merde, faites en ce que vous voulez...&lt;br /&gt;
&lt;br /&gt;
Vous remarquerez cependant qu'on ne cherche pas '''le mot''' dab, mais la présence de d suivi de a suivi de b dans '''tout le message'''. Ainsi, le pattern matchera si votre message contient 'abracadabra'. Si vous souhaitez bel et bien matcher '''le mot''' dab, alors il faudra utiliser la regexp &amp;lt;code&amp;gt;/\bdab\b/&amp;lt;/code&amp;gt;. On notera la présence de '\b' avant et après dab, qui signifient &amp;quot;break&amp;quot;. Un break est soit un espace, soit le début ou la fin du message. C'est donc tout à fait ce que nous voulons.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Screen&amp;diff=173</id>
		<title>Screen</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Screen&amp;diff=173"/>
				<updated>2018-04-22T10:40:38Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Queries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The screen block is used to build web screens. To configure it (i.e. change rights, rotation, resolution, etc...), use the [[Screen Configurator]] item.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Screen.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the bottom line is a [[Backlight]].&lt;br /&gt;
&lt;br /&gt;
==How to build==&lt;br /&gt;
The screen block alone is useless. In order to build a working screen, you need to place screen blocks in a plane configuration (width x height x 1 multiblock structure). The minimum size is 2x2 (this can't be changed), and the default maximum size is 16x16 (this can be changed in the configuration file). Once the structure is built, simply right-click on the side where you want the screen to be &amp;lt;strong&amp;gt;with an empty hand&amp;lt;/strong&amp;gt;. Horizontal screens are supported since WebDisplays 1.12.2.&lt;br /&gt;
&lt;br /&gt;
[[File:ValidScreen.png|427px|center|A valid screen structure]]&lt;br /&gt;
&lt;br /&gt;
==Interacting with the screen==&lt;br /&gt;
===Changing the URL===&lt;br /&gt;
To change the screen URL, sneak and right-click (again, with an empty hand) the screen.&lt;br /&gt;
&lt;br /&gt;
[[File:SetURLUI.png|427px|center|The GUI used to change the URL]]&lt;br /&gt;
&lt;br /&gt;
If you forget the protocol, WebDisplays will automatically add &amp;quot;http://&amp;quot; at the beginning of your URL. The &amp;quot;YT&amp;quot; button is used to turn regular YouTube URLs to embed (full-screen) YouTube URLs. It will unlock if a YouTube URL is detected. Clicking it while holding shift will add the auto-play argument to the URL so that the embedded movie starts immediately once the page is loaded.&lt;br /&gt;
&lt;br /&gt;
Please note that some videos (like music videos) do not allow embedding, so this doesn't always work.&lt;br /&gt;
&lt;br /&gt;
===Clicking===&lt;br /&gt;
There are two ways to click on the screen. The first one consists in right-clicking the screen with an empty hand. The second requires the [[Laser Sensor]] upgrade and the [[Laser Pointer]] item. How to use them is described in detail on their respective pages.&lt;br /&gt;
&lt;br /&gt;
All these methods will perform &amp;lt;strong&amp;gt;left-clicks&amp;lt;/strong&amp;gt; on the web browser. Currently, there is no way to right-click.&lt;br /&gt;
&lt;br /&gt;
===Typing===&lt;br /&gt;
You can type using the [[Keyboard]] peripheral. After placing it, use the [[Linking Tool]] to bind it to the screen, and then right-click on the keyboard to start typing. To exit the keyboard, press Escape.&lt;br /&gt;
&lt;br /&gt;
==Permissions &amp;amp; ownership==&lt;br /&gt;
Since WebDisplays 1.12.2, every screen has an owner. Depending on the screen's configuration, players (except the owner of course) have restricted access to that screen. The only way to change the screen owner is by either breaking the screen and re-creating it, or by using the [[Ownership Thief]] item (which is only available via the /give command).&lt;br /&gt;
&lt;br /&gt;
The owner does not only have all rights on his screen, but is also responsible for sending some JavaScript queries to the server. Thus, if he is disconnected or outside the screen view range, some JavaScript functionalities will be unavailable (for instance, all JS queries provided by the [[Redstone Output Port]] will be ineffective).&lt;br /&gt;
&lt;br /&gt;
==Multiplayer synchronization==&lt;br /&gt;
In Multiplayer, screens &amp;lt;strong&amp;gt;ARE NOT&amp;lt;/strong&amp;gt; fully synchronized. Every player has a separate web browser instance, and may not see web pages the same way. Most of the time web pages do not change depending on who's watching them; in this case Screens look synchronized. However, the YouTube homepage, for instance, suggests videos based on your video history (among other things). So if a player clicks on a video on the YouTube homepage, everyone may see a different video depending on what YouTube suggested (that's why you should always copy/paste the URL if you want to display a specific video).&lt;br /&gt;
&lt;br /&gt;
==Extensibility==&lt;br /&gt;
WebDisplays screens feature two extension mechanisms: peripherals and upgrades.&lt;br /&gt;
&lt;br /&gt;
===Peripherals===&lt;br /&gt;
Peripherals are blocks which can be linked to screens using the [[Linking Tool]]. Currently, WebDisplays features 5 peripherals:&lt;br /&gt;
* The [[Keyboard]]&lt;br /&gt;
* The [[ComputerCraft Interface]], disabled for the moment since ComputerCraft is not up to date&lt;br /&gt;
* The [[OpenComputers Interface]], which allows OpenComputers to interact with screens&lt;br /&gt;
* The [[Remote Controller]], which enable the user to change the browser URL remotely&lt;br /&gt;
* The [[Redstone Controller]], which changes the URL depending on a redstone signal&lt;br /&gt;
&lt;br /&gt;
===Upgrades===&lt;br /&gt;
Upgrades are items that provides additionnal features to the screen. Simply right-click on the screen with an upgrade in hand to install it. To remove an upgrade, you'll have to use a [[Screen Configurator]].&lt;br /&gt;
Right now, WebDisplays offers 4 upgrades:&lt;br /&gt;
* The [[Laser Sensor]], required to use the [[Laser Pointer]]&lt;br /&gt;
* The [[Redstone Input Port]] enables web pages to read the redstone levels for each screen blocks.&lt;br /&gt;
* The [[Redstone Output Port]] enables web pages to make some screen blocks emit redstone signals.&lt;br /&gt;
* The [[GPS Module]] adds a JavaScript function to fetch the X, Y and Z location of the screen.&lt;br /&gt;
&lt;br /&gt;
==Special URLs==&lt;br /&gt;
===Player pages===&lt;br /&gt;
Because of the new features allowing JavaScript to interact with redstone, players can upload small web pages to the server, making them available to other players. This is done using the [[Server]] block. This functionality can be disabled through the configuration file.&lt;br /&gt;
&lt;br /&gt;
These pages can be accesses through special URLs that look like this: &amp;lt;code&amp;gt;wd://player-uuid/page.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Internal pages===&lt;br /&gt;
WebDisplays comes with 3 internal pages:&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/main.html&amp;lt;/code&amp;gt; The default homepage&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/io.html&amp;lt;/code&amp;gt; Is a page that demoes the [[Redstone Input Port]] and the [[Redstone Output Port]] capabilities&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/blacklisted.html&amp;lt;/code&amp;gt; Is displayed if a blacklisted page shows up&lt;br /&gt;
&lt;br /&gt;
==JavaScript==&lt;br /&gt;
Web pages may interact with screens using MCEF queries. These can be invoked using the following code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line='line'&amp;gt;&lt;br /&gt;
window.mcefQuery({request: &amp;quot;WebDisplays_{QueryName}&amp;quot;,&lt;br /&gt;
	persistent: true,&lt;br /&gt;
	onSuccess: function(response) {},&lt;br /&gt;
	onFailure: function(errCode, errMsg) {}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some queries require parameters to work. Parameters are passed in the query name between parenthesis. For instance, the &amp;lt;code&amp;gt;GetRedstoneAt&amp;lt;/code&amp;gt; requires x and y parameters, so the request name should look like this: &amp;lt;code&amp;gt;WebDisplays_GetRedstoneAt(0, 0)&amp;lt;/code&amp;gt;. Please note that the query names are case insensitive.&lt;br /&gt;
&lt;br /&gt;
WebDisplays will return data in the JSON format through the &amp;lt;code&amp;gt;success&amp;lt;/code&amp;gt; callback.&lt;br /&gt;
&lt;br /&gt;
You can also use the [https://github.com/montoyo/webdisplays/blob/master/src/main/resources/assets/webdisplays/html/wdlib.js wdlib.js] file, which is completely free and features easy-to-use functions to interact with WebDisplays.&lt;br /&gt;
&lt;br /&gt;
===Queries===&lt;br /&gt;
This is a list of queries which do not require any extension to work:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Query name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return value&lt;br /&gt;
!Comment&lt;br /&gt;
|-&lt;br /&gt;
|GetSize||None||&amp;lt;code&amp;gt;{&amp;quot;x&amp;quot;:int,&amp;quot;y&amp;quot;:int}&amp;lt;/code&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|GetUpgrades||None||&amp;lt;code&amp;gt;{&amp;quot;upgrades&amp;quot;:[string]}&amp;lt;/code&amp;gt;||The name of each upgrades can be found on their wiki page&lt;br /&gt;
|-&lt;br /&gt;
|IsOwner||None||&amp;lt;code&amp;gt;{&amp;quot;isOwner&amp;quot;:bool}&amp;lt;/code&amp;gt;||Returns true if the client is the screen owner&lt;br /&gt;
|-&lt;br /&gt;
|GetRotation||None||&amp;lt;code&amp;gt;{&amp;quot;rotation&amp;quot;:int}&amp;lt;/code&amp;gt;||Multiply by 90 to get the and in degrees&lt;br /&gt;
|-&lt;br /&gt;
|GetSide||None||&amp;lt;code&amp;gt;{&amp;quot;side&amp;quot;:int}&amp;lt;/code&amp;gt;||0 to 5 (inclusive), B-T-N-S-W-E order&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
This is a list of functions called by WebDisplays&lt;br /&gt;
* &amp;lt;code&amp;gt;webdisplaysUpgradesChanged()&amp;lt;/code&amp;gt; will be called when an upgrade is installed or removed from the screen&lt;br /&gt;
&lt;br /&gt;
==Domain blacklist==&lt;br /&gt;
You can black-list some domain names through the WebDisplays configuration file. Be aware that this system is subdomain-sensitive, so if you blacklist example.com, www.example.com will still be accessible.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Screen&amp;diff=172</id>
		<title>Screen</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Screen&amp;diff=172"/>
				<updated>2018-04-22T10:35:52Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Multiplayer synchronization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The screen block is used to build web screens. To configure it (i.e. change rights, rotation, resolution, etc...), use the [[Screen Configurator]] item.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Screen.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the bottom line is a [[Backlight]].&lt;br /&gt;
&lt;br /&gt;
==How to build==&lt;br /&gt;
The screen block alone is useless. In order to build a working screen, you need to place screen blocks in a plane configuration (width x height x 1 multiblock structure). The minimum size is 2x2 (this can't be changed), and the default maximum size is 16x16 (this can be changed in the configuration file). Once the structure is built, simply right-click on the side where you want the screen to be &amp;lt;strong&amp;gt;with an empty hand&amp;lt;/strong&amp;gt;. Horizontal screens are supported since WebDisplays 1.12.2.&lt;br /&gt;
&lt;br /&gt;
[[File:ValidScreen.png|427px|center|A valid screen structure]]&lt;br /&gt;
&lt;br /&gt;
==Interacting with the screen==&lt;br /&gt;
===Changing the URL===&lt;br /&gt;
To change the screen URL, sneak and right-click (again, with an empty hand) the screen.&lt;br /&gt;
&lt;br /&gt;
[[File:SetURLUI.png|427px|center|The GUI used to change the URL]]&lt;br /&gt;
&lt;br /&gt;
If you forget the protocol, WebDisplays will automatically add &amp;quot;http://&amp;quot; at the beginning of your URL. The &amp;quot;YT&amp;quot; button is used to turn regular YouTube URLs to embed (full-screen) YouTube URLs. It will unlock if a YouTube URL is detected. Clicking it while holding shift will add the auto-play argument to the URL so that the embedded movie starts immediately once the page is loaded.&lt;br /&gt;
&lt;br /&gt;
Please note that some videos (like music videos) do not allow embedding, so this doesn't always work.&lt;br /&gt;
&lt;br /&gt;
===Clicking===&lt;br /&gt;
There are two ways to click on the screen. The first one consists in right-clicking the screen with an empty hand. The second requires the [[Laser Sensor]] upgrade and the [[Laser Pointer]] item. How to use them is described in detail on their respective pages.&lt;br /&gt;
&lt;br /&gt;
All these methods will perform &amp;lt;strong&amp;gt;left-clicks&amp;lt;/strong&amp;gt; on the web browser. Currently, there is no way to right-click.&lt;br /&gt;
&lt;br /&gt;
===Typing===&lt;br /&gt;
You can type using the [[Keyboard]] peripheral. After placing it, use the [[Linking Tool]] to bind it to the screen, and then right-click on the keyboard to start typing. To exit the keyboard, press Escape.&lt;br /&gt;
&lt;br /&gt;
==Permissions &amp;amp; ownership==&lt;br /&gt;
Since WebDisplays 1.12.2, every screen has an owner. Depending on the screen's configuration, players (except the owner of course) have restricted access to that screen. The only way to change the screen owner is by either breaking the screen and re-creating it, or by using the [[Ownership Thief]] item (which is only available via the /give command).&lt;br /&gt;
&lt;br /&gt;
The owner does not only have all rights on his screen, but is also responsible for sending some JavaScript queries to the server. Thus, if he is disconnected or outside the screen view range, some JavaScript functionalities will be unavailable (for instance, all JS queries provided by the [[Redstone Output Port]] will be ineffective).&lt;br /&gt;
&lt;br /&gt;
==Multiplayer synchronization==&lt;br /&gt;
In Multiplayer, screens &amp;lt;strong&amp;gt;ARE NOT&amp;lt;/strong&amp;gt; fully synchronized. Every player has a separate web browser instance, and may not see web pages the same way. Most of the time web pages do not change depending on who's watching them; in this case Screens look synchronized. However, the YouTube homepage, for instance, suggests videos based on your video history (among other things). So if a player clicks on a video on the YouTube homepage, everyone may see a different video depending on what YouTube suggested (that's why you should always copy/paste the URL if you want to display a specific video).&lt;br /&gt;
&lt;br /&gt;
==Extensibility==&lt;br /&gt;
WebDisplays screens feature two extension mechanisms: peripherals and upgrades.&lt;br /&gt;
&lt;br /&gt;
===Peripherals===&lt;br /&gt;
Peripherals are blocks which can be linked to screens using the [[Linking Tool]]. Currently, WebDisplays features 5 peripherals:&lt;br /&gt;
* The [[Keyboard]]&lt;br /&gt;
* The [[ComputerCraft Interface]], disabled for the moment since ComputerCraft is not up to date&lt;br /&gt;
* The [[OpenComputers Interface]], which allows OpenComputers to interact with screens&lt;br /&gt;
* The [[Remote Controller]], which enable the user to change the browser URL remotely&lt;br /&gt;
* The [[Redstone Controller]], which changes the URL depending on a redstone signal&lt;br /&gt;
&lt;br /&gt;
===Upgrades===&lt;br /&gt;
Upgrades are items that provides additionnal features to the screen. Simply right-click on the screen with an upgrade in hand to install it. To remove an upgrade, you'll have to use a [[Screen Configurator]].&lt;br /&gt;
Right now, WebDisplays offers 4 upgrades:&lt;br /&gt;
* The [[Laser Sensor]], required to use the [[Laser Pointer]]&lt;br /&gt;
* The [[Redstone Input Port]] enables web pages to read the redstone levels for each screen blocks.&lt;br /&gt;
* The [[Redstone Output Port]] enables web pages to make some screen blocks emit redstone signals.&lt;br /&gt;
* The [[GPS Module]] adds a JavaScript function to fetch the X, Y and Z location of the screen.&lt;br /&gt;
&lt;br /&gt;
==Special URLs==&lt;br /&gt;
===Player pages===&lt;br /&gt;
Because of the new features allowing JavaScript to interact with redstone, players can upload small web pages to the server, making them available to other players. This is done using the [[Server]] block. This functionality can be disabled through the configuration file.&lt;br /&gt;
&lt;br /&gt;
These pages can be accesses through special URLs that look like this: &amp;lt;code&amp;gt;wd://player-uuid/page.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Internal pages===&lt;br /&gt;
WebDisplays comes with 3 internal pages:&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/main.html&amp;lt;/code&amp;gt; The default homepage&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/io.html&amp;lt;/code&amp;gt; Is a page that demoes the [[Redstone Input Port]] and the [[Redstone Output Port]] capabilities&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/blacklisted.html&amp;lt;/code&amp;gt; Is displayed if a blacklisted page shows up&lt;br /&gt;
&lt;br /&gt;
==JavaScript==&lt;br /&gt;
Web pages may interact with screens using MCEF queries. These can be invoked using the following code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line='line'&amp;gt;&lt;br /&gt;
window.mcefQuery({request: &amp;quot;WebDisplays_{QueryName}&amp;quot;,&lt;br /&gt;
	persistent: true,&lt;br /&gt;
	onSuccess: function(response) {},&lt;br /&gt;
	onFailure: function(errCode, errMsg) {}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some queries require parameters to work. Parameters are passed in the query name between parenthesis. For instance, the &amp;lt;code&amp;gt;GetRedstoneAt&amp;lt;/code&amp;gt; requires x and y parameters, so the request name should look like this: &amp;lt;code&amp;gt;WebDisplays_GetRedstoneAt(0, 0)&amp;lt;/code&amp;gt;. Please note that the query names are case insensitive.&lt;br /&gt;
&lt;br /&gt;
WebDisplays will return data in the JSON format through the &amp;lt;code&amp;gt;success&amp;lt;/code&amp;gt; callback.&lt;br /&gt;
&lt;br /&gt;
You can also use the [https://github.com/montoyo/webdisplays/blob/master/src/main/resources/assets/webdisplays/html/wdlib.js wdlib.js] file, which is completely free and features easy-to-use functions to interact with WebDisplays.&lt;br /&gt;
&lt;br /&gt;
===Queries===&lt;br /&gt;
This is a list of queries which do not require any extension to work:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Query name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return value&lt;br /&gt;
!Comment&lt;br /&gt;
|-&lt;br /&gt;
|GetSize||None||&amp;lt;code&amp;gt;{&amp;quot;x&amp;quot;: int, &amp;quot;y&amp;quot;: int}&amp;lt;/code&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|GetUpgrades||None||&amp;lt;code&amp;gt;{&amp;quot;upgrades&amp;quot;:[string]}&amp;lt;/code&amp;gt;||The name of each upgrades can be found on their wiki page&lt;br /&gt;
|-&lt;br /&gt;
|IsOwner||None||&amp;lt;code&amp;gt;{&amp;quot;isOwner&amp;quot;:bool}&amp;lt;/code&amp;gt;||Returns true if the client is the screen owner&lt;br /&gt;
|-&lt;br /&gt;
|GetRotation||None||&amp;lt;code&amp;gt;{&amp;quot;rotation&amp;quot;:int}&amp;lt;/code&amp;gt;||Multiply by 90 to get the and in degrees&lt;br /&gt;
|-&lt;br /&gt;
|GetSide||None||&amp;lt;code&amp;gt;{&amp;quot;side&amp;quot;:int}&amp;lt;/code&amp;gt;||0 to 5 (inclusive), B-T-N-S-W-E order&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
This is a list of functions called by WebDisplays&lt;br /&gt;
* &amp;lt;code&amp;gt;webdisplaysUpgradesChanged()&amp;lt;/code&amp;gt; will be called when an upgrade is installed or removed from the screen&lt;br /&gt;
&lt;br /&gt;
==Domain blacklist==&lt;br /&gt;
You can black-list some domain names through the WebDisplays configuration file. Be aware that this system is subdomain-sensitive, so if you blacklist example.com, www.example.com will still be accessible.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Screen&amp;diff=171</id>
		<title>Screen</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Screen&amp;diff=171"/>
				<updated>2018-04-22T10:35:28Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: /* Multiplayer synchronization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The screen block is used to build web screens. To configure it (i.e. change rights, rotation, resolution, etc...), use the [[Screen Configurator]] item.&lt;br /&gt;
&lt;br /&gt;
{{#widget:AdSense}}&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Screen.png]]&lt;br /&gt;
&lt;br /&gt;
The item on the bottom line is a [[Backlight]].&lt;br /&gt;
&lt;br /&gt;
==How to build==&lt;br /&gt;
The screen block alone is useless. In order to build a working screen, you need to place screen blocks in a plane configuration (width x height x 1 multiblock structure). The minimum size is 2x2 (this can't be changed), and the default maximum size is 16x16 (this can be changed in the configuration file). Once the structure is built, simply right-click on the side where you want the screen to be &amp;lt;strong&amp;gt;with an empty hand&amp;lt;/strong&amp;gt;. Horizontal screens are supported since WebDisplays 1.12.2.&lt;br /&gt;
&lt;br /&gt;
[[File:ValidScreen.png|427px|center|A valid screen structure]]&lt;br /&gt;
&lt;br /&gt;
==Interacting with the screen==&lt;br /&gt;
===Changing the URL===&lt;br /&gt;
To change the screen URL, sneak and right-click (again, with an empty hand) the screen.&lt;br /&gt;
&lt;br /&gt;
[[File:SetURLUI.png|427px|center|The GUI used to change the URL]]&lt;br /&gt;
&lt;br /&gt;
If you forget the protocol, WebDisplays will automatically add &amp;quot;http://&amp;quot; at the beginning of your URL. The &amp;quot;YT&amp;quot; button is used to turn regular YouTube URLs to embed (full-screen) YouTube URLs. It will unlock if a YouTube URL is detected. Clicking it while holding shift will add the auto-play argument to the URL so that the embedded movie starts immediately once the page is loaded.&lt;br /&gt;
&lt;br /&gt;
Please note that some videos (like music videos) do not allow embedding, so this doesn't always work.&lt;br /&gt;
&lt;br /&gt;
===Clicking===&lt;br /&gt;
There are two ways to click on the screen. The first one consists in right-clicking the screen with an empty hand. The second requires the [[Laser Sensor]] upgrade and the [[Laser Pointer]] item. How to use them is described in detail on their respective pages.&lt;br /&gt;
&lt;br /&gt;
All these methods will perform &amp;lt;strong&amp;gt;left-clicks&amp;lt;/strong&amp;gt; on the web browser. Currently, there is no way to right-click.&lt;br /&gt;
&lt;br /&gt;
===Typing===&lt;br /&gt;
You can type using the [[Keyboard]] peripheral. After placing it, use the [[Linking Tool]] to bind it to the screen, and then right-click on the keyboard to start typing. To exit the keyboard, press Escape.&lt;br /&gt;
&lt;br /&gt;
==Permissions &amp;amp; ownership==&lt;br /&gt;
Since WebDisplays 1.12.2, every screen has an owner. Depending on the screen's configuration, players (except the owner of course) have restricted access to that screen. The only way to change the screen owner is by either breaking the screen and re-creating it, or by using the [[Ownership Thief]] item (which is only available via the /give command).&lt;br /&gt;
&lt;br /&gt;
The owner does not only have all rights on his screen, but is also responsible for sending some JavaScript queries to the server. Thus, if he is disconnected or outside the screen view range, some JavaScript functionalities will be unavailable (for instance, all JS queries provided by the [[Redstone Output Port]] will be ineffective).&lt;br /&gt;
&lt;br /&gt;
==Multiplayer synchronization==&lt;br /&gt;
In Multiplayer, screens &amp;lt;strong&amp;gt;ARE NOT&amp;lt;/strong&amp;gt; fully synchronized. Every player has a separate web browser instance, and may not see web pages the same way you do. Most of the time web pages do not change depending on who's watching them; in this case Screens look synchronized. However, the YouTube homepage, for instance, suggests videos based on your video history (among other things). So if a player clicks on a video on the YouTube homepage, everyone may see a different video depending on what YouTube suggested (that's why you should always copy/paste the URL if you want to display a specific video).&lt;br /&gt;
&lt;br /&gt;
==Extensibility==&lt;br /&gt;
WebDisplays screens feature two extension mechanisms: peripherals and upgrades.&lt;br /&gt;
&lt;br /&gt;
===Peripherals===&lt;br /&gt;
Peripherals are blocks which can be linked to screens using the [[Linking Tool]]. Currently, WebDisplays features 5 peripherals:&lt;br /&gt;
* The [[Keyboard]]&lt;br /&gt;
* The [[ComputerCraft Interface]], disabled for the moment since ComputerCraft is not up to date&lt;br /&gt;
* The [[OpenComputers Interface]], which allows OpenComputers to interact with screens&lt;br /&gt;
* The [[Remote Controller]], which enable the user to change the browser URL remotely&lt;br /&gt;
* The [[Redstone Controller]], which changes the URL depending on a redstone signal&lt;br /&gt;
&lt;br /&gt;
===Upgrades===&lt;br /&gt;
Upgrades are items that provides additionnal features to the screen. Simply right-click on the screen with an upgrade in hand to install it. To remove an upgrade, you'll have to use a [[Screen Configurator]].&lt;br /&gt;
Right now, WebDisplays offers 4 upgrades:&lt;br /&gt;
* The [[Laser Sensor]], required to use the [[Laser Pointer]]&lt;br /&gt;
* The [[Redstone Input Port]] enables web pages to read the redstone levels for each screen blocks.&lt;br /&gt;
* The [[Redstone Output Port]] enables web pages to make some screen blocks emit redstone signals.&lt;br /&gt;
* The [[GPS Module]] adds a JavaScript function to fetch the X, Y and Z location of the screen.&lt;br /&gt;
&lt;br /&gt;
==Special URLs==&lt;br /&gt;
===Player pages===&lt;br /&gt;
Because of the new features allowing JavaScript to interact with redstone, players can upload small web pages to the server, making them available to other players. This is done using the [[Server]] block. This functionality can be disabled through the configuration file.&lt;br /&gt;
&lt;br /&gt;
These pages can be accesses through special URLs that look like this: &amp;lt;code&amp;gt;wd://player-uuid/page.html&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Internal pages===&lt;br /&gt;
WebDisplays comes with 3 internal pages:&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/main.html&amp;lt;/code&amp;gt; The default homepage&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/io.html&amp;lt;/code&amp;gt; Is a page that demoes the [[Redstone Input Port]] and the [[Redstone Output Port]] capabilities&lt;br /&gt;
* &amp;lt;code&amp;gt;mod://webdisplays/blacklisted.html&amp;lt;/code&amp;gt; Is displayed if a blacklisted page shows up&lt;br /&gt;
&lt;br /&gt;
==JavaScript==&lt;br /&gt;
Web pages may interact with screens using MCEF queries. These can be invoked using the following code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot; line='line'&amp;gt;&lt;br /&gt;
window.mcefQuery({request: &amp;quot;WebDisplays_{QueryName}&amp;quot;,&lt;br /&gt;
	persistent: true,&lt;br /&gt;
	onSuccess: function(response) {},&lt;br /&gt;
	onFailure: function(errCode, errMsg) {}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some queries require parameters to work. Parameters are passed in the query name between parenthesis. For instance, the &amp;lt;code&amp;gt;GetRedstoneAt&amp;lt;/code&amp;gt; requires x and y parameters, so the request name should look like this: &amp;lt;code&amp;gt;WebDisplays_GetRedstoneAt(0, 0)&amp;lt;/code&amp;gt;. Please note that the query names are case insensitive.&lt;br /&gt;
&lt;br /&gt;
WebDisplays will return data in the JSON format through the &amp;lt;code&amp;gt;success&amp;lt;/code&amp;gt; callback.&lt;br /&gt;
&lt;br /&gt;
You can also use the [https://github.com/montoyo/webdisplays/blob/master/src/main/resources/assets/webdisplays/html/wdlib.js wdlib.js] file, which is completely free and features easy-to-use functions to interact with WebDisplays.&lt;br /&gt;
&lt;br /&gt;
===Queries===&lt;br /&gt;
This is a list of queries which do not require any extension to work:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Query name&lt;br /&gt;
!Arguments&lt;br /&gt;
!Return value&lt;br /&gt;
!Comment&lt;br /&gt;
|-&lt;br /&gt;
|GetSize||None||&amp;lt;code&amp;gt;{&amp;quot;x&amp;quot;: int, &amp;quot;y&amp;quot;: int}&amp;lt;/code&amp;gt;||&lt;br /&gt;
|-&lt;br /&gt;
|GetUpgrades||None||&amp;lt;code&amp;gt;{&amp;quot;upgrades&amp;quot;:[string]}&amp;lt;/code&amp;gt;||The name of each upgrades can be found on their wiki page&lt;br /&gt;
|-&lt;br /&gt;
|IsOwner||None||&amp;lt;code&amp;gt;{&amp;quot;isOwner&amp;quot;:bool}&amp;lt;/code&amp;gt;||Returns true if the client is the screen owner&lt;br /&gt;
|-&lt;br /&gt;
|GetRotation||None||&amp;lt;code&amp;gt;{&amp;quot;rotation&amp;quot;:int}&amp;lt;/code&amp;gt;||Multiply by 90 to get the and in degrees&lt;br /&gt;
|-&lt;br /&gt;
|GetSide||None||&amp;lt;code&amp;gt;{&amp;quot;side&amp;quot;:int}&amp;lt;/code&amp;gt;||0 to 5 (inclusive), B-T-N-S-W-E order&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Callbacks===&lt;br /&gt;
This is a list of functions called by WebDisplays&lt;br /&gt;
* &amp;lt;code&amp;gt;webdisplaysUpgradesChanged()&amp;lt;/code&amp;gt; will be called when an upgrade is installed or removed from the screen&lt;br /&gt;
&lt;br /&gt;
==Domain blacklist==&lt;br /&gt;
You can black-list some domain names through the WebDisplays configuration file. Be aware that this system is subdomain-sensitive, so if you blacklist example.com, www.example.com will still be accessible.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=170</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=170"/>
				<updated>2018-04-22T10:27:46Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#widget:WDCube}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Welcome to the WebDisplays wiki!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you can find all kind of informations about the WebDisplays mod blocks &amp;amp; items, as well as the documentation for some JavaScript functions. If you're in the game, you can also hover a WebDisplays item and press F1 to open the corresponding wiki page using the internal web browser!&lt;br /&gt;
&lt;br /&gt;
Hope you're having fun with the mod, - montoyo.&lt;br /&gt;
&lt;br /&gt;
==Quick start==&lt;br /&gt;
To get into the mod, you probably want to check out the [[Screen]] page :p&lt;br /&gt;
&lt;br /&gt;
==Downloading &amp;amp; installing==&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.10.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 12.18.3.2185 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 0.9 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.12.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 14.23.2.2611 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 0.9 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
&lt;br /&gt;
===Download link===&lt;br /&gt;
Hit the button below to access the download page:&lt;br /&gt;
[[File:Download.png|center|link=https://montoyo.net/wd3/?modid=webdisplays|Click here to download the mod]]&lt;br /&gt;
&lt;br /&gt;
==Mod License==&lt;br /&gt;
Even though the source code is public, the following license applies:&lt;br /&gt;
&lt;br /&gt;
This software, its source code and its binaries are Copyright © 2018 Nicolas BARBOTIN and are the intellectual property of the author.&lt;br /&gt;
It may be not be reproduced under any circumstances except for personal, private use as long as it remains in its unaltered, unedited form.&lt;br /&gt;
It may not be placed on any web site or otherwise distributed publicly without advance written permission.&lt;br /&gt;
Use of this software on any other website or as a part of any public display is strictly prohibited, and a violation of copyright.&lt;br /&gt;
&lt;br /&gt;
==Bugs==&lt;br /&gt;
===Screen stays white===&lt;br /&gt;
This is likely an MCEF bug. If you are on Linux or Mac, this is to be expected. WebDisplays &amp;amp; MCEF are not yet available on these platforms; don't report a bug.&lt;br /&gt;
If you think this is a legitimate bug, you can post on issue on the [https://github.com/montoyo/mcef/issues MCEF bug tracker], but don't forget to follow the rules stated in [[#Other bugs]]!&lt;br /&gt;
&lt;br /&gt;
===Other bugs===&lt;br /&gt;
If you'd like to report a bug, go on the project's [https://github.com/montoyo/webdisplays/issues GitHub bug tracker], and follow these rules:&lt;br /&gt;
* Make sure you're using WebDisplays 1.0 (for MC 1.10.2 or 1.12.2) or later. Previous versions aren't supported anymore.&lt;br /&gt;
* Make sure your issue doesn't already exist&lt;br /&gt;
* In the title, add the Minecraft AND mod versions&lt;br /&gt;
* Tell me how to reproduce the bug&lt;br /&gt;
* Send me your log (&amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;). To do this please use pastebin (or any pastebin clone)&lt;br /&gt;
&lt;br /&gt;
If you ignore any of these rules I won't be able to fix the bug!&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Flash?===&lt;br /&gt;
No. You shouldn't be using Flash anyway, it has some serious security issues...&lt;br /&gt;
&lt;br /&gt;
===Chrome extensions?===&lt;br /&gt;
WebDisplays is using MCEF, which uses JCEF, which in turn uses CEF. Unfortunately, the Chromium Embedded Framework does not support extesions.&lt;br /&gt;
&lt;br /&gt;
===ALL MY SCREENS ARE WHITE===&lt;br /&gt;
This is not a WebDisplays bug, but rather a MCEF bug. Check the [[#Screen stays white]] section for more informations.&lt;br /&gt;
&lt;br /&gt;
===Where are my log files?===&lt;br /&gt;
On Windows, if you didn't change the Minecraft location, open the file explorer and in the location field type &amp;lt;code&amp;gt;%appdata%\.minecraft\logs&amp;lt;/code&amp;gt;. The file you are looking for is &amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;. &amp;lt;strong&amp;gt;NEVER&amp;lt;/strong&amp;gt; copy paste it in a message but rather upload it on [https://pastebin.com pastebin] and then paste the link in the message.&lt;br /&gt;
&lt;br /&gt;
===How can I change the home page?===&lt;br /&gt;
By editing the configuration file located in the .minecraft\config directory. Open webdisplays.cfg and change the value on the line that starts with &amp;quot;S:homepage=&amp;quot;. I know this is a bit complicated and I'll probably change this in a future WebDisplays version.&lt;br /&gt;
&lt;br /&gt;
===I want to put your mod in a modpack===&lt;br /&gt;
If your modpack will be distributed to less than 10 people, go on. For 10 people or more, contact me using the e-mail address on my [https://github.com/montoyo/ GitHub profile].&lt;br /&gt;
&lt;br /&gt;
===Linux?===&lt;br /&gt;
I'll try to port MCEF for Linux.&lt;br /&gt;
&lt;br /&gt;
===Mac?===&lt;br /&gt;
Buy me a Mac first.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Server&amp;diff=169</id>
		<title>Server</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Server&amp;diff=169"/>
				<updated>2018-02-15T15:37:01Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Server block is a block which can be used to host small web pages. These pages will then be publicly available to other players through special URLs. This functionality can be disabled by setting the &amp;quot;miniservPort&amp;quot; value to 0 in the WebDisplays configuration file. The storage quota can also be changed through the configuration file.&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Server.png]]&lt;br /&gt;
&lt;br /&gt;
Even though the server is not a peripheral, its recipe uses a [[Peripheral Base]] as an ingredient.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
Player pages uploaded with server blocks can be accessed through special URLs that look like this: &amp;lt;code&amp;gt;wd://player-uuid/page.ext&amp;lt;/code&amp;gt;. Since they are quite long (because of the player UUID), they can be obtained with the &amp;quot;url&amp;quot; command of the server block.&lt;br /&gt;
&lt;br /&gt;
The server block works a little bit like the Ender Chest. It is useless for a player to place several server blocks as they will all have the same content. Destroying every server blocks placed by a player will not delete the uploaded pages. However, unlike the Ender Chest, each server block is linked to a player, and only the player who placed the block can upload files. Other players, on the other hand, are able to use some commands to list the files uploaded by the owner, get their URLs etc...&lt;br /&gt;
&lt;br /&gt;
With the server block, everything is done through commands. Most of them do not require any arguments, so simply write the name of the command and hit enter. Here's a list of the most important commands:&lt;br /&gt;
&lt;br /&gt;
===ls===&lt;br /&gt;
Lists the file uploaded by the server block owner.&lt;br /&gt;
&lt;br /&gt;
===url===&lt;br /&gt;
&amp;lt;strong&amp;gt;Argument:&amp;lt;/strong&amp;gt; the file name&lt;br /&gt;
&lt;br /&gt;
Copies the URL that leads to file passed in parameter. This URL can then pasted in the set-URL GUIs of both [[Screen|Screens]] and [[minePad|minePads]].&lt;br /&gt;
&lt;br /&gt;
===owner===&lt;br /&gt;
Displays the name and the UUID of the owner of this server block.&lt;br /&gt;
&lt;br /&gt;
===reconnect===&lt;br /&gt;
This is a debug command. Internally, files are not transferred using the Minecraft packet system, but rather using a custom system named &amp;quot;Miniserv&amp;quot;. Thus, it is possible to loose the connection to Miniserv without loosing the connection to the Minecraft server. If this happens, most of the commands listed here will fail. You can then use this command to try to reconnect to the Miniserv server.&lt;br /&gt;
&lt;br /&gt;
===quota===&lt;br /&gt;
Only the server block owner can do that. It will display how much space your files are using on the server. This space is of course limited. By default, every player has 1 MiO, but this can be configured in the WebDisplays configuration file.&lt;br /&gt;
&lt;br /&gt;
===rm===&lt;br /&gt;
&amp;lt;strong&amp;gt;Argument:&amp;lt;/strong&amp;gt; the name of the file you want to delete&lt;br /&gt;
&lt;br /&gt;
Only the server block owner can do that. Deletes an uploaded file. Double-check what you're doing because this is permanent and there is no confirmation.&lt;br /&gt;
&lt;br /&gt;
===upload===&lt;br /&gt;
Optional argument: the directory to start from, or the path to a file you want to upload&lt;br /&gt;
&lt;br /&gt;
Only the server block owner can do that. This command will open the upload wizard. This is just a crude file browser. Select a file with the up/down arrow keys, and hit enter to either enter a directory or upload a file. You can also type the beginning of a file name to find it, just like you'd do with the Windows file explorer. The F5 key will also reload the contents of the current directory. Pressing the Escape key will not close the GUI but will leave the upload wizard.&lt;br /&gt;
&lt;br /&gt;
===access===&lt;br /&gt;
RfiQYRn7fBg&lt;br /&gt;
&lt;br /&gt;
==Server-global hosting==&lt;br /&gt;
The files uploaded by the players are located in the wd_filehost directory inside the world save. If you want to host files &amp;quot;manually&amp;quot;, create a directory called &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot; and put your files in it. They should be available at &amp;quot;wd://0-0-0-0-0/myfile.ext&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Server&amp;diff=168</id>
		<title>Server</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Server&amp;diff=168"/>
				<updated>2018-02-15T15:33:19Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Server block is a block which can be used to host small web pages. These pages will then be publicly available to other players through special URLs. This functionality can be disabled by setting the &amp;quot;miniservPort&amp;quot; value to 0 in the WebDisplays configuration file. The storage quota can also be changed through the configuration file.&lt;br /&gt;
&lt;br /&gt;
==Recipe==&lt;br /&gt;
[[File:Server.png]]&lt;br /&gt;
&lt;br /&gt;
Even though the server is not a peripheral, its recipe uses a [[Peripheral Base]] as an ingredient.&lt;br /&gt;
&lt;br /&gt;
==How to use==&lt;br /&gt;
Player pages uploaded with server blocks can be accessed through special URLs that look like this: &amp;lt;code&amp;gt;wd://player-uuid/page.ext&amp;lt;/code&amp;gt;. Since they are quite long (because of the player UUID), they can be obtained with the &amp;quot;url&amp;quot; command of the server block.&lt;br /&gt;
&lt;br /&gt;
The server block works a little bit like the Ender Chest. It is useless for a player to place several server blocks as they will all have the same content. Destroying every server blocks placed by a player will not delete the uploaded pages. However, unlike the Ender Chest, each server block is linked to a player, and only the player who placed the block can upload files. Other players, on the other hand, are able to use some commands to list the files uploaded by the owner, get their URLs etc...&lt;br /&gt;
&lt;br /&gt;
With the server block, everything is done through commands. Most of them do not require any arguments, so simply write the name of the command and hit enter. Here's a list of the most important commands:&lt;br /&gt;
&lt;br /&gt;
===ls===&lt;br /&gt;
Lists the file uploaded by the server block owner.&lt;br /&gt;
&lt;br /&gt;
===url===&lt;br /&gt;
&amp;lt;strong&amp;gt;Argument:&amp;lt;/strong&amp;gt; the file name&lt;br /&gt;
&lt;br /&gt;
Copies the URL that leads to file passed in parameter. This URL can then pasted in the set-URL GUIs of both [[Screen|Screens]] and [[minePad|minePads]].&lt;br /&gt;
&lt;br /&gt;
===owner===&lt;br /&gt;
Displays the name and the UUID of the owner of this server block.&lt;br /&gt;
&lt;br /&gt;
===reconnect===&lt;br /&gt;
This is a debug command. Internally, files are not transferred using the Minecraft packet system, but rather using a custom system named &amp;quot;Miniserv&amp;quot;. Thus, it is possible to loose the connection to Miniserv without loosing the connection to the Minecraft server. If this happens, most of the commands listed here will fail. You can then use this command to try to reconnect to the Miniserv server.&lt;br /&gt;
&lt;br /&gt;
===quota===&lt;br /&gt;
Only the server block owner can do that. It will display how much space your files are using on the server. This space is of course limited. By default, every player has 1 MiO, but this can be configured in the WebDisplays configuration file.&lt;br /&gt;
&lt;br /&gt;
===rm===&lt;br /&gt;
&amp;lt;strong&amp;gt;Argument:&amp;lt;/strong&amp;gt; the name of the file you want to delete&lt;br /&gt;
&lt;br /&gt;
Only the server block owner can do that. Deletes an uploaded file. Double-check what you're doing because this is permanent and there is no confirmation.&lt;br /&gt;
&lt;br /&gt;
===upload===&lt;br /&gt;
Optional argument: the directory to start from, or the path to a file you want to upload&lt;br /&gt;
&lt;br /&gt;
Only the server block owner can do that. This command will open the upload wizard. This is just a crude file browser. Select a file with the up/down arrow keys, and hit enter to either enter a directory or upload a file. You can also type the beginning of a file name to find it, just like you'd do with the Windows file explorer. The F5 key will also reload the contents of the current directory. Pressing the Escape key will not close the GUI but will leave the upload wizard.&lt;br /&gt;
&lt;br /&gt;
===access===&lt;br /&gt;
RfiQYRn7fBg&lt;br /&gt;
&lt;br /&gt;
==Manual Hosting==&lt;br /&gt;
The files uploaded by the players are located in the wd_filehost directory inside the world save. If you want to host files &amp;quot;manually&amp;quot;, create a directory called &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot; and put your files in it. They should be available at &amp;quot;wd://0-0-0-0-0/myfile.ext&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=167</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=167"/>
				<updated>2018-02-15T14:03:36Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#widget:WDCube}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Welcome to the WebDisplays wiki!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you can find all kind of informations about the WebDisplays mod blocks &amp;amp; items, as well as the documentation for some JavaScript functions. If you're in the game, you can also hover a WebDisplays item and press F1 to open the corresponding wiki page using the internal web browser!&lt;br /&gt;
&lt;br /&gt;
Hoping you're having fun with the mod, - montoyo.&lt;br /&gt;
&lt;br /&gt;
==Quick start==&lt;br /&gt;
To get into the mod, you probably want to check out the [[Screen]] page :p&lt;br /&gt;
&lt;br /&gt;
==Downloading &amp;amp; installing==&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.10.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 12.18.3.2185 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 0.9 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.12.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 14.23.2.2611 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 0.9 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
&lt;br /&gt;
===Download link===&lt;br /&gt;
Hit the button below to access the download page:&lt;br /&gt;
[[File:Download.png|center|link=https://montoyo.net/wd3/?modid=webdisplays|Click here to download the mod]]&lt;br /&gt;
&lt;br /&gt;
==Mod License==&lt;br /&gt;
Even though the source code is public, the following license applies:&lt;br /&gt;
&lt;br /&gt;
This software, its source code and its binaries are Copyright © 2018 Nicolas BARBOTIN and are the intellectual property of the author.&lt;br /&gt;
It may be not be reproduced under any circumstances except for personal, private use as long as it remains in its unaltered, unedited form.&lt;br /&gt;
It may not be placed on any web site or otherwise distributed publicly without advance written permission.&lt;br /&gt;
Use of this software on any other website or as a part of any public display is strictly prohibited, and a violation of copyright.&lt;br /&gt;
&lt;br /&gt;
==Bugs==&lt;br /&gt;
===Screen stays white===&lt;br /&gt;
This is likely an MCEF bug. If you are on Linux or Mac, this is to be expected. WebDisplays &amp;amp; MCEF are not yet available on these platforms; don't report a bug.&lt;br /&gt;
If you think this is a legitimate bug, you can post on issue on the [https://github.com/montoyo/mcef/issues MCEF bug tracker], but don't forget to follow the rules stated in [[#Other bugs]]!&lt;br /&gt;
&lt;br /&gt;
===Other bugs===&lt;br /&gt;
If you'd like to report a bug, go on the project's [https://github.com/montoyo/webdisplays/issues GitHub bug tracker], and follow these rules:&lt;br /&gt;
* Make sure you're using WebDisplays 1.0 (for MC 1.10.2 or 1.12.2) or later. Previous versions aren't supported anymore.&lt;br /&gt;
* Make sure your issue doesn't already exist&lt;br /&gt;
* In the title, add the Minecraft AND mod versions&lt;br /&gt;
* Tell me how to reproduce the bug&lt;br /&gt;
* Send me your log (&amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;). To do this please use pastebin (or any pastebin clone)&lt;br /&gt;
&lt;br /&gt;
If you ignore any of these rules I won't be able to fix the bug!&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Flash?===&lt;br /&gt;
No. You shouldn't be using Flash anyway, it has some serious security issues...&lt;br /&gt;
&lt;br /&gt;
===Chrome extensions?===&lt;br /&gt;
WebDisplays is using MCEF, which uses JCEF, which in turn uses CEF. Unfortunately, the Chromium Embedded Framework does not support extesions.&lt;br /&gt;
&lt;br /&gt;
===ALL MY SCREENS ARE WHITE===&lt;br /&gt;
This is not a WebDisplays bug, but rather a MCEF bug. Check the [[#Screen stays white]] section for more informations.&lt;br /&gt;
&lt;br /&gt;
===Where are my log files?===&lt;br /&gt;
On Windows, if you didn't change the Minecraft location, open the file explorer and in the location field type &amp;lt;code&amp;gt;%appdata%\.minecraft\logs&amp;lt;/code&amp;gt;. The file you are looking for is &amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;. &amp;lt;strong&amp;gt;NEVER&amp;lt;/strong&amp;gt; copy paste it in a message but rather upload it on [https://pastebin.com pastebin] and then paste the link in the message.&lt;br /&gt;
&lt;br /&gt;
===How can I change the home page?===&lt;br /&gt;
By editing the configuration file located in the .minecraft\config directory. Open webdisplays.cfg and change the value on the line that starts with &amp;quot;S:homepage=&amp;quot;. I know this is a bit complicated and I'll probably change this in a future WebDisplays version.&lt;br /&gt;
&lt;br /&gt;
===I want to put your mod in a modpack===&lt;br /&gt;
If your modpack will be distributed to less than 10 people, go on. For 10 people or more, contact me using the e-mail address on my [https://github.com/montoyo/ GitHub profile].&lt;br /&gt;
&lt;br /&gt;
===Linux?===&lt;br /&gt;
I'll try to port MCEF for Linux.&lt;br /&gt;
&lt;br /&gt;
===Mac?===&lt;br /&gt;
Buy me a Mac first.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=166</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=Main_Page&amp;diff=166"/>
				<updated>2018-02-15T14:03:31Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#widget:WDCube}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Welcome to the WebDisplays wiki!&amp;lt;/strong&amp;gt;&lt;br /&gt;
wo&lt;br /&gt;
&lt;br /&gt;
Here you can find all kind of informations about the WebDisplays mod blocks &amp;amp; items, as well as the documentation for some JavaScript functions. If you're in the game, you can also hover a WebDisplays item and press F1 to open the corresponding wiki page using the internal web browser!&lt;br /&gt;
&lt;br /&gt;
Hoping you're having fun with the mod, - montoyo.&lt;br /&gt;
&lt;br /&gt;
==Quick start==&lt;br /&gt;
To get into the mod, you probably want to check out the [[Screen]] page :p&lt;br /&gt;
&lt;br /&gt;
==Downloading &amp;amp; installing==&lt;br /&gt;
===Dependencies===&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.10.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 12.18.3.2185 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 0.9 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;For MC 1.12.2:&amp;lt;/strong&amp;gt;&lt;br /&gt;
* [https://files.minecraftforge.net Forge] 14.23.2.2611 or later&lt;br /&gt;
* [https://montoyo.net/wd3/?modid=mcef MCEF] 0.9 or later&lt;br /&gt;
* (Optional) [https://minecraft.curseforge.com/projects/opencomputers/files OpenComputers]&lt;br /&gt;
&lt;br /&gt;
===Download link===&lt;br /&gt;
Hit the button below to access the download page:&lt;br /&gt;
[[File:Download.png|center|link=https://montoyo.net/wd3/?modid=webdisplays|Click here to download the mod]]&lt;br /&gt;
&lt;br /&gt;
==Mod License==&lt;br /&gt;
Even though the source code is public, the following license applies:&lt;br /&gt;
&lt;br /&gt;
This software, its source code and its binaries are Copyright © 2018 Nicolas BARBOTIN and are the intellectual property of the author.&lt;br /&gt;
It may be not be reproduced under any circumstances except for personal, private use as long as it remains in its unaltered, unedited form.&lt;br /&gt;
It may not be placed on any web site or otherwise distributed publicly without advance written permission.&lt;br /&gt;
Use of this software on any other website or as a part of any public display is strictly prohibited, and a violation of copyright.&lt;br /&gt;
&lt;br /&gt;
==Bugs==&lt;br /&gt;
===Screen stays white===&lt;br /&gt;
This is likely an MCEF bug. If you are on Linux or Mac, this is to be expected. WebDisplays &amp;amp; MCEF are not yet available on these platforms; don't report a bug.&lt;br /&gt;
If you think this is a legitimate bug, you can post on issue on the [https://github.com/montoyo/mcef/issues MCEF bug tracker], but don't forget to follow the rules stated in [[#Other bugs]]!&lt;br /&gt;
&lt;br /&gt;
===Other bugs===&lt;br /&gt;
If you'd like to report a bug, go on the project's [https://github.com/montoyo/webdisplays/issues GitHub bug tracker], and follow these rules:&lt;br /&gt;
* Make sure you're using WebDisplays 1.0 (for MC 1.10.2 or 1.12.2) or later. Previous versions aren't supported anymore.&lt;br /&gt;
* Make sure your issue doesn't already exist&lt;br /&gt;
* In the title, add the Minecraft AND mod versions&lt;br /&gt;
* Tell me how to reproduce the bug&lt;br /&gt;
* Send me your log (&amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;). To do this please use pastebin (or any pastebin clone)&lt;br /&gt;
&lt;br /&gt;
If you ignore any of these rules I won't be able to fix the bug!&lt;br /&gt;
&lt;br /&gt;
==FAQ==&lt;br /&gt;
===Flash?===&lt;br /&gt;
No. You shouldn't be using Flash anyway, it has some serious security issues...&lt;br /&gt;
&lt;br /&gt;
===Chrome extensions?===&lt;br /&gt;
WebDisplays is using MCEF, which uses JCEF, which in turn uses CEF. Unfortunately, the Chromium Embedded Framework does not support extesions.&lt;br /&gt;
&lt;br /&gt;
===ALL MY SCREENS ARE WHITE===&lt;br /&gt;
This is not a WebDisplays bug, but rather a MCEF bug. Check the [[#Screen stays white]] section for more informations.&lt;br /&gt;
&lt;br /&gt;
===Where are my log files?===&lt;br /&gt;
On Windows, if you didn't change the Minecraft location, open the file explorer and in the location field type &amp;lt;code&amp;gt;%appdata%\.minecraft\logs&amp;lt;/code&amp;gt;. The file you are looking for is &amp;lt;code&amp;gt;fml-client-latest.log&amp;lt;/code&amp;gt;. &amp;lt;strong&amp;gt;NEVER&amp;lt;/strong&amp;gt; copy paste it in a message but rather upload it on [https://pastebin.com pastebin] and then paste the link in the message.&lt;br /&gt;
&lt;br /&gt;
===How can I change the home page?===&lt;br /&gt;
By editing the configuration file located in the .minecraft\config directory. Open webdisplays.cfg and change the value on the line that starts with &amp;quot;S:homepage=&amp;quot;. I know this is a bit complicated and I'll probably change this in a future WebDisplays version.&lt;br /&gt;
&lt;br /&gt;
===I want to put your mod in a modpack===&lt;br /&gt;
If your modpack will be distributed to less than 10 people, go on. For 10 people or more, contact me using the e-mail address on my [https://github.com/montoyo/ GitHub profile].&lt;br /&gt;
&lt;br /&gt;
===Linux?===&lt;br /&gt;
I'll try to port MCEF for Linux.&lt;br /&gt;
&lt;br /&gt;
===Mac?===&lt;br /&gt;
Buy me a Mac first.&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=MediaWiki:Common.css&amp;diff=165</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=MediaWiki:Common.css&amp;diff=165"/>
				<updated>2018-02-15T13:57:02Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
@keyframes wd-cube-rot {&lt;br /&gt;
	0% { transform: rotateX(-20deg) rotateY(40deg); }&lt;br /&gt;
	90% { transform: rotateX(-20deg) rotateY(40deg); }&lt;br /&gt;
	100% { transform: rotateX(-20deg) rotateY(400deg); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube-3d {&lt;br /&gt;
	padding: 20px;&lt;br /&gt;
	perspective: 800px;&lt;br /&gt;
	perspective-origin: 50px 50px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	width: 100px;&lt;br /&gt;
	height: 100px;&lt;br /&gt;
	transform-style: preserve-3d;&lt;br /&gt;
	animation: wd-cube-rot 10s infinite linear;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube div {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	width: 100px;&lt;br /&gt;
	height: 100px;&lt;br /&gt;
	background-image: url(&amp;quot;/ShareX/wdcube-side.png&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-front {&lt;br /&gt;
	transform: translateZ(50px);&lt;br /&gt;
	background-image: url(&amp;quot;/ShareX/wdcube-front.png&amp;quot;) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-back {&lt;br /&gt;
	transform: translateZ(-50px) rotateY(180deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-left {&lt;br /&gt;
	transform: translateX(-50px) rotateY(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-right {&lt;br /&gt;
	transform: translateX(50px) rotateY(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-top {&lt;br /&gt;
	transform: translateY(-50px) rotateX(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-wd {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=MediaWiki:Common.css&amp;diff=164</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=MediaWiki:Common.css&amp;diff=164"/>
				<updated>2018-02-15T13:56:28Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
@keyframes wd-cube-rot {&lt;br /&gt;
	0% { transform: rotateX(-20deg) rotateY(40deg); }&lt;br /&gt;
	80% { transform: rotateX(-20deg) rotateY(40deg); }&lt;br /&gt;
	100% { transform: rotateX(-20deg) rotateY(400deg); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube-3d {&lt;br /&gt;
	padding: 20px;&lt;br /&gt;
	perspective: 800px;&lt;br /&gt;
	perspective-origin: 50px 50px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	width: 100px;&lt;br /&gt;
	height: 100px;&lt;br /&gt;
	transform-style: preserve-3d;&lt;br /&gt;
	animation: wd-cube-rot 10s infinite linear;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube div {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	width: 100px;&lt;br /&gt;
	height: 100px;&lt;br /&gt;
	background-image: url(&amp;quot;/ShareX/wdcube-side.png&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-front {&lt;br /&gt;
	transform: translateZ(50px);&lt;br /&gt;
	background-image: url(&amp;quot;/ShareX/wdcube-front.png&amp;quot;) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-back {&lt;br /&gt;
	transform: translateZ(-50px) rotateY(180deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-left {&lt;br /&gt;
	transform: translateX(-50px) rotateY(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-right {&lt;br /&gt;
	transform: translateX(50px) rotateY(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-top {&lt;br /&gt;
	transform: translateY(-50px) rotateX(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-wd {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	<entry>
		<id>https://montoyo.net/wdwiki/index.php?title=MediaWiki:Common.css&amp;diff=163</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://montoyo.net/wdwiki/index.php?title=MediaWiki:Common.css&amp;diff=163"/>
				<updated>2018-02-15T13:55:46Z</updated>
		
		<summary type="html">&lt;p&gt;Montoyo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
@keyframes wd-cube-rot {&lt;br /&gt;
	0% { transform: rotateX(-20deg) rotateY(40deg); }&lt;br /&gt;
	90% { transform: rotateX(-20deg) rotateY(40deg); }&lt;br /&gt;
	100% { transform: rotateX(-20deg) rotateY(400deg); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube-3d {&lt;br /&gt;
	padding: 20px;&lt;br /&gt;
	perspective: 800px;&lt;br /&gt;
	perspective-origin: 50px 50px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	width: 100px;&lt;br /&gt;
	height: 100px;&lt;br /&gt;
	transform-style: preserve-3d;&lt;br /&gt;
	animation: wd-cube-rot 20s infinite linear;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wd-cube div {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	width: 100px;&lt;br /&gt;
	height: 100px;&lt;br /&gt;
	background-image: url(&amp;quot;/ShareX/wdcube-side.png&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-front {&lt;br /&gt;
	transform: translateZ(50px);&lt;br /&gt;
	background-image: url(&amp;quot;/ShareX/wdcube-front.png&amp;quot;) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-back {&lt;br /&gt;
	transform: translateZ(-50px) rotateY(180deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-left {&lt;br /&gt;
	transform: translateX(-50px) rotateY(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-right {&lt;br /&gt;
	transform: translateX(50px) rotateY(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-top {&lt;br /&gt;
	transform: translateY(-50px) rotateX(-90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#wdcube-wd {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Montoyo</name></author>	</entry>

	</feed>