<snapdata remixID="14733378"><project name="messager: chatroom (cross project testing)" app="Snap! 11.0.8, https://snap.berkeley.edu" version="2"><notes>a sequel to the original messager, now with a limited message history and a new chat model that allows for many people to join a room and chat together!</notes><thumbnail>data:image/png;base64,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</thumbnail><scenes select="1"><scene name="messager: chatroom (cross project testing)"><notes>a sequel to the original messager, now with a limited message history and a new chat model that allows for many people to join a room and chat together!</notes><palette><category name="MQTT" color="143,0,100,1"/></palette><hidden></hidden><headers></headers><code></code><blocks><block-definition s="$cloudOutline MQTT connect to %&apos;broker&apos; %&apos;options&apos;" type="command" category="MQTT"><comment x="0" y="0" w="455" collapsed="false">Connect to a broker&#xD;&#xD;The options are not required but can be filled if needed&#xD;&#xD;1. username (some brokers need this)&#xD;2. password (some brokers need this)&#xD;3. keepalive (default time is 60 seconds but some brokers need a shorter time)&#xD;4. connection callback (ringed set of scripts to be run when connection is made or remade)&#xD;&#xD;ADVANCED: The brokers offered in the menu are accessed using default ports and  basepaths (if needed).  If accessing other brokers, the complete urls should be formed like this:&#xD;&#xD;siteURL:port/basepath &#xD;e.g mqtt.eclipseprojects.io:443/mqtt&#xD;&#xD;It is possible to have more than one connection to the same broker, for instance, using two different user/pass accounts simultaneously. To do this, add a connection id at the end of the broker:&#xD;&#xD;e.g mqtt.eclipseprojects.io:443/mqtt|1&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%mult%s" expand="username&#xD;password&#xD;keepalive&#xD;connection callback" max="4">​&#xD;​&#xD;60</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><l/></custom-block></block><block s="doDeclareVariables"><list><l>connection status</l><l>callback</l></list></block><block s="doSetVar"><l>connection status</l><l>connecting</l></block><block s="doSetVar"><l>callback</l><l></l></block><block s="doIf"><block s="reportIsA"><block s="reportListItem"><l>4</l><block var="options"/></block><l><option>command</option></l></block><script><block s="doSetVar"><l>callback</l><block s="reportListItem"><l>4</l><block var="options"/></block></block></script><list></list></block><block s="doSetVar"><l>options</l><block s="reportListAttribute"><l><option>json</option></l><block s="reportNewList"><list><block s="reportNewList"><list><l>username</l><block s="reportListItem"><l>1</l><block var="options"/></block></list></block><block s="reportNewList"><list><l>password</l><block s="reportListItem"><l>2</l><block var="options"/></block></list></block><block s="reportNewList"><list><l>keepalive</l><block s="reportListItem"><l>3</l><block var="options"/></block></list></block></list></block></block></block><block s="doApplyExtension"><l>mqt_connect(broker,callback,options)</l><list><block var="broker"/><block var="callback"/><block var="options"/></list></block><block s="doWaitUntil"><block s="reportNot"><block s="reportVariadicEquals"><list><block var="connection status"/><l>connecting</l></list></block></block></block><block s="doIf"><block s="reportNot"><block s="reportVariadicEquals"><list><block var="connection status"/><l>connected</l></list></block></block><script><block s="doApplyExtension"><l>err_error(msg)</l><list><block var="connection status"/></list></block></script><list></list></block></script></block-definition><block-definition s="$cloudOutline MQTT subscribe to %&apos;broker&apos; topic %&apos;topic&apos; $nl on each message run %&apos;callback&apos; %&apos;options&apos;" type="command" category="MQTT"><comment x="0" y="0" w="306.99999999999943" collapsed="false">Subscribe to a topic on a broker&#xD;&#xD;Make sure you have already run an MQTT connect block before using this one&#xD;&#xD;You should add a script to be run inside he grey ring.&#xD;&#xD;It will be run each time a message is received&#xD;&#xD;If you click on the arrow on the grey ring twice, you can use #1 and #2 inside your script.&#xD;&#xD;#1 will contain the received payload&#xD;&#xD;#2 will contain the received topic name&#xD;&#xD;The options are not required but can be filled if needed&#xD;&#xD;1. Subscribed QoS (0,1 or 2)  Note this will be downgraded if it exceeds the QoS of the stored message held on the broker &#xD;&#xD;2. Binary mode (boolean) Default (false) - payload is returned as text&#xD;&#xD;If true, payload returned as single column list of values in the range of 0 to 255..  </comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input><input type="%cmdRing"></input><input type="%mult%s" expand="QoS&#xD;binary mode" max="2">0&#xD;false</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><l></l><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><block s="doSetVar"><l>options</l><block s="reportListAttribute"><l><option>json</option></l><block s="reportNewList"><list><block s="reportNewList"><list><l>qos</l><block s="reportListItem"><l>1</l><block var="options"/></block></list></block><block s="reportNewList"><list><l>mode</l><block s="reportListItem"><l>2</l><block var="options"/></block></list></block></list></block></block></block><block s="doApplyExtension"><l>mqt_sub(broker,topic,callback,options)</l><list><block var="broker"/><block var="topic"/><block var="callback"/><block var="options"/></list></block></script></block-definition><block-definition s="$cloudOutline MQTT publish to %&apos;broker&apos; topic %&apos;topic&apos; payload %&apos;payload&apos; %&apos;options&apos;" type="command" category="MQTT"><comment x="0" y="0" w="455" collapsed="false">Publish a message to an MQTT broker&#xD;&#xD;The options are not required but can be filled if needed&#xD;&#xD;1. QoS (quality of service 0,1 or 2 - see  https://www.emqx.com/en/blog/introduction-to-mqtt-qos)&#xD;&#xD;2. Retain flag (boolean)&#xD;&#xD;3. Binary mode (boolean).    Default (false) - the payload is published as text&#xD;&#xD;If set to true then payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes.&#xD;&#xD;Note:  If the payload is a list and you don&apos;t set the buffer mode option, it will be automatically be converted into JSON and sent as text.&#xD;&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input><input type="%mlt">hello</input><input type="%mult%s" expand="QoS&#xD;retain flag&#xD;binary mode" max="3">0&#xD;false&#xD;false</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><l></l><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><block s="doSetVar"><l>options</l><block s="reportListAttribute"><l><option>json</option></l><block s="reportNewList"><list><block s="reportNewList"><list><l>qos</l><block s="reportListItem"><l>1</l><block var="options"/></block></list></block><block s="reportNewList"><list><l>retain</l><block s="reportListItem"><l>2</l><block var="options"/></block></list></block><block s="reportNewList"><list><l>mode</l><block s="reportListItem"><l>3</l><block var="options"/></block></list></block></list></block></block></block><block s="doIf"><block s="reportNot"><block s="reportListItem"><l>2</l><block s="reportListItem"><l>3</l><block s="reportTextSplit"><block var="options"/><l><option>json</option></l></block></block></block></block><script><block s="doIf"><block s="reportIsA"><block var="message"/><l><option>list</option></l></block><script><block s="doSetVar"><l>message</l><block s="reportListAttribute"><l><option>json</option></l><block var="message"/></block></block></script><list></list></block><block s="doIf"><block s="reportIsA"><block var="message"/><l><option>number</option></l></block><script><block s="doSetVar"><l>message</l><block s="reportJoinWords"><list><block var="message"/></list></block></block></script><list></list></block></script><list></list></block><block s="doApplyExtension"><l>mqt_pub(broker,topic,payload,options)</l><list><block var="broker"/><block var="topic"/><block var="message"/><block var="options"/></list></block></script></block-definition><block-definition s="$cloudOutline MQTT unsubscribe from %&apos;broker&apos; topic %&apos;topic&apos;" type="command" category="MQTT"><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doApplyExtension"><l>mqt_unsub(broker,topic)</l><list><block var="broker"/><block var="topic"/></list></block></script></block-definition><block-definition s="$cloudOutline MQTT disconnect from %&apos;broker&apos;" type="command" category="MQTT"><header></header><code></code><translations></translations><inputs><input type="%s">all<options>all&#xD;broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doApplyExtension"><l>mqt_disconnect(broker)</l><list><block var="broker"/></list></block></script></block-definition><block-definition s="$cloudOutline MQTT response %&apos;broker&apos; topic %&apos;topic&apos; $nl reply %&apos;reply&apos; %&apos;options&apos;" type="command" category="MQTT"><comment x="0" y="0" w="292.22207031250036" collapsed="false">Options:&#xD;&#xD;1. Sub binary mode (boolean) Default (false) - received payload is returned as text. &#xD;&#xD;If true then subscribed, received payload is returned as single column list of values in the range of 0 to 255..  Default (false) - it is returned as text&#xD;&#xD;2.  Pub binary mode (boolean).  Default (false) - the payload is published as text.&#xD;&#xD;If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes.&#xD;&#xD;Note:  If the payload is a list and you don&apos;t set the buffer mode option, it will be automatically be converted into JSON and sent as text&#xD;&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name/#</input><input type="%repRing"></input><input type="%mult%s" expand="sub binary mode&#xD;pub binary mode" max="2">false&#xD;false</input></inputs><script><block s="doDeclareVariables"><list><l>resp</l><l>callbackTopic</l><l>error</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><block var="broker"/><block var="topic"/><block s="reifyScript"><script><block s="doIf"><block s="reportVariadicGreaterThan"><list><block s="reportApplyExtension"><l>txt_indexof(sub, txt)</l><list><l>/@</l><block var="received topic"/></list></block><l>0</l></list></block><script><block s="doApplyExtension"><l>err_try(cmd, catch, err)</l><list><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block s="evaluate"><block var="reply"/><list><block var="received payload"/><block var="received topic"/></list></block></block></script><list></list></block><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block s="evaluate"><block var="reply"/><list></list></block></block></script><list></list></block><block var="error"/></list></block><block s="doApplyExtension"><l>err_reset</l><list></list></block><block s="doSetVar"><l>callbackTopic</l><block s="reportListItem"><l><option>last</option></l><block s="reportTextSplit"><block var="received topic"/><l>@</l></block></block></block><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><block var="broker"/><block var="callbackTopic"/><block var="resp"/><list><l></l><l></l><block s="reportListItem"><l>2</l><block var="options"/></block></list></custom-block></script><list></list></block></script><list><l>received payload</l><l>received topic</l></list></block><list><l>0</l><block s="reportListItem"><l>1</l><block var="options"/></block></list></custom-block></script></block-definition><block-definition s="$cloudOutline MQTT request %&apos;broker&apos; topic %&apos;topic&apos; $nl response topic %&apos;rtopic&apos; payload %&apos;payload&apos; $nl on response run %&apos;callback&apos; %&apos;options&apos;" type="command" category="MQTT"><comment x="0" y="0" w="242.99999999999997" collapsed="false">The options are not required but can be filled if needed.&#xD;&#xD;1. Append response topic (boolean): If true, the response topic is added at the end of the call topic after @ sign. The default condition (true) response topic is added.&#xD;&#xD;2. Sub binary mode (boolean) Default (false) - received payload is returned as text. &#xD;&#xD;If true,then the subscribed, received payload is returned as a single column list of values in the range of 0 to 255..  &#xD;&#xD;3.  Pub binary mode (boolean).  Default (false) - the payload is published as text.&#xD;&#xD;If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes.&#xD;&#xD;Note:  If the payload is a list and you don&apos;t set the buffer mode option, it will be automatically be converted into JSON and sent as text&#xD;&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input><input type="%s">name2</input><input type="%mlt">hello</input><input type="%cmdRing"></input><input type="%mult%s" expand="append response topic&#xD;sub binary mode&#xD;pub binary mode&#xD;" max="3">true&#xD;false&#xD;false</input></inputs><script><block s="doDeclareVariables"><list><l>error</l><l>informTopic</l><l>topicCall</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><block s="doSetVar"><l>informTopic</l><block s="reportIfElse"><block s="reportIsA"><block s="reportListItem"><l>1</l><block var="options"/></block><l><option>Boolean</option></l></block><block s="reportListItem"><l>1</l><block var="options"/></block><block s="reportBoolean"><l><bool>true</bool></l></block></block></block><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><block var="broker"/><block s="reportJoinWords"><list><block var="rtopic"/></list></block><block s="reifyScript"><script><block s="doApplyExtension"><l>err_try(cmd, catch, err)</l><list><block s="reifyScript"><script><block s="doRun"><block var="callback"/><list><block var="received payload"/><block var="received topic"/></list></block></script><list></list></block><block s="reifyScript"><script><block s="doRun"><block var="callback"/><list></list></block></script><list></list></block><block var="error"/></list></block></script><list><l>received payload</l><l>received topic</l></list></block><list><l>0</l><block s="reportListItem"><l>2</l><block var="options"/></block></list></custom-block><block s="doIfElse"><block var="informTopic"/><script><block s="doSetVar"><l>topicCall</l><block s="reportJoinWords"><list><block var="topic"/><l>/</l><block s="reportJoinWords"><list><l>@</l><block var="rtopic"/></list></block></list></block></block></script><script><block s="doSetVar"><l>topicCall</l><block var="topic"/></block></script></block><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><block var="broker"/><block var="topicCall"/><block var="message"/><list><l></l><l></l><block s="reportListItem"><l>3</l><block var="options"/></block></list></custom-block></script></block-definition><block-definition s="$cloudOutline MQTT example response reporter payload %&apos;payload&apos; topic %&apos;topic&apos;" type="reporter" category="MQTT"><comment x="0" y="0" w="90" collapsed="false">This is a simple echo example.&#xD;Topic can be used to filter the response.</comment><header></header><code></code><translations></translations><inputs><input type="%mlt">hello</input><input type="%txt">name</input></inputs><script><block s="doReport"><block var="message"/></block></script></block-definition><block-definition s="$cloudOutline MQTT request %&apos;broker&apos; topic %&apos;topic&apos; $nl response topic %&apos;rtopic&apos; payload %&apos;payload&apos; %&apos;options&apos;" type="reporter" category="MQTT"><comment x="0" y="0" w="343" collapsed="false">The response topic should be a unique value for each call e.g. use timer&#xD;&#xD;The options are not required but can be filled if needed&#xD;&#xD;1.  Timeout value - default is 3 seconds&#xD;&#xD;2.  Append response topic (boolean): If true, the response topic is added at the end of the call topic after @ sign. The default condition (true) response topic is added.&#xD;&#xD;3. Sub binary mode (boolean) Default (false) - received payload is returned as text. &#xD;&#xD;If true, subscribed, received payload returned as single column list of values in the range of 0 to 255..  Default (false) - it is returned as text&#xD;&#xD;4.  Pub binary mode (boolean).  Default (false) - the payload is published as text.&#xD;&#xD;If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes.&#xD;&#xD;Note:  If the payload is a list and you don&apos;t set the buffer mode option, it will be automatically be converted into JSON and sent as text&#xD;&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input><input type="%s">name2</input><input type="%mlt">hello</input><input type="%mult%s" expand="timeout&#xD;append response topic&#xD;sub binary mode&#xD;pub binary mode&#xD;" max="4">3&#xD;true&#xD;false&#xD;false</input></inputs><script><block s="doDeclareVariables"><list><l>resp</l><l>semaphore</l><l>timer0</l><l>timeout</l><l>informTopic</l><l>topicCall</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><l></l><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><block s="doSetVar"><l>semaphore</l><l>0</l></block><block s="doSetVar"><l>timeout</l><block s="reportIfElse"><block s="reportIsA"><block s="reportListItem"><l>1</l><block var="options"/></block><l><option>number</option></l></block><block s="reportListItem"><l>1</l><block var="options"/></block><l>3</l></block></block><block s="doSetVar"><l>informTopic</l><block s="reportIfElse"><block s="reportIsA"><block s="reportListItem"><l>2</l><block var="options"/></block><l><option>Boolean</option></l></block><block s="reportListItem"><l>2</l><block var="options"/></block><block s="reportBoolean"><l><bool>true</bool></l></block></block></block><block s="doSetVar"><l>resp</l><l>timeout</l></block><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><block var="broker"/><block s="reportJoinWords"><list><block var="rtopic"/></list></block><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block var="received payload"/></block><block s="doSetVar"><l>semaphore</l><l>1</l></block></script><list><l>received payload</l><l>received topic</l></list></block><list><l>0</l><block s="reportListItem"><l>3</l><block var="options"/></block></list></custom-block><block s="doIfElse"><block var="informTopic"/><script><block s="doSetVar"><l>topicCall</l><block s="reportJoinWords"><list><block var="topic"/><l>/</l><block s="reportJoinWords"><list><l>@</l><block var="rtopic"/></list></block></list></block></block></script><script><block s="doSetVar"><l>topicCall</l><block var="topic"/></block></script></block><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><block var="broker"/><block var="topicCall"/><block var="message"/><list><l>0</l><l>false</l><block s="reportListItem"><l>4</l><block var="options"/></block></list></custom-block><block s="doSetVar"><l>timer0</l><block s="reportDate"><l><option>time in milliseconds</option></l></block></block><block s="doWaitUntil"><block s="reportVariadicOr"><list><block s="reportVariadicEquals"><list><block var="semaphore"/><l>1</l></list></block><block s="reportVariadicGreaterThan"><list><block s="reportDifference"><block s="reportDate"><l><option>time in milliseconds</option></l></block><block var="timer0"/></block><block s="reportVariadicProduct"><list><block var="timeout"/><l>1000</l></list></block></list></block></list></block></block><custom-block s="$cloudOutline MQTT unsubscribe from %s topic %s"><block var="broker"/><block s="reportJoinWords"><list><block var="rtopic"/></list></block></custom-block><block s="doReport"><block var="resp"/></block></script></block-definition><block-definition s="MQTT Extension Examples" type="command" category="MQTT"><comment x="0" y="0" w="385.9999999999999" collapsed="false">Open (edit) this block to look at examples how to use the MQTT Extension blocks&#xD;&#xD;Background documentation:&#xD;https://github.com/pixavier/mqtt4snap&#xD;&#xD;Last source code version (mqtt.xml and mqttExtension.js):&#xD;https://gitlab.com/cymplecy/Snap/-/tree/master/libraries</comment><header></header><code></code><translations></translations><inputs></inputs><scripts><comment x="489.9999999999995" y="215.19999999999987" w="222.99999999999997" collapsed="false">Step 0: Connect to the broker</comment><comment x="31.33333333333337" y="152.20000000000016" w="239.99999999999997" collapsed="false">PubSub Hello World!</comment><comment x="489.9999999999995" y="271.19999999999953" w="222" collapsed="false">Step 1: Subscribe to a topic</comment><script x="25.33333333333337" y="272.1999999999993"><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><l>broker.emqx.io</l><l>name</l><block s="reifyScript"><script><block s="doSayFor"><block var="payload"/><l>2</l></block></script><list><l>payload</l><l>received topic</l></list></block><list></list></custom-block></script><script x="29.33333333333337" y="366.86666666666605"><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><l>name</l><l>hello</l><list></list></custom-block></script><comment x="492.9999999999995" y="357.1999999999993" w="222" collapsed="false">Step 2: Publish a message</comment><script x="33.99999999999966" y="484.1999999999998"><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><l>broker.emqx.io</l><l>name1</l><block s="reifyScript"><script><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><l>name2</l><block var="payload"/><list></list></custom-block></script><list><l>payload</l><l>topic</l></list></block><list></list></custom-block></script><comment x="498.99999999999994" y="481.6999999999982" w="220" collapsed="false">Step 1: Activate the responder as a simple subscription</comment><script x="32.999999999999886" y="602.0333333333334"><block s="doSayFor"><custom-block s="$cloudOutline MQTT request %s topic %s %br response topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><l>name1</l><l>name2</l><l>hello</l><list><l>3</l><l>false</l></list></custom-block><l>2</l></block></script><comment x="499.99999999999994" y="606.6999999999988" w="220" collapsed="false">Step 2: Send a request and wait the answer.</comment><comment x="504.9999999999995" y="131.19999999999993" w="191" collapsed="false">To execute the examples, single click on blocks, following the corresponding steps.</comment><comment x="499.6666666666669" y="756.3666666666653" w="224.00000000000003" collapsed="false">Step 2 bis: Send a request and do not wait for the answer</comment><comment x="24.33333333333337" y="871.1999999999986" w="356.99999999999994" collapsed="false">Synchronous client-server Hello World! with dynamic response topic (timer)</comment><comment x="510.9999999999995" y="930.7000000000008" w="220" collapsed="false">Step 1: Activate the responder</comment><script x="34.33333333333337" y="1048.1999999999982"><block s="doSayFor"><custom-block s="$cloudOutline MQTT request %s topic %s %br response topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><l>name</l><block s="getTimer"></block><l>hello</l><list></list></custom-block><l>2</l></block></script><comment x="510.9999999999995" y="1050.6999999999987" w="219.0000000000002" collapsed="false">Step 2: Send a request (timer acts as idCall) and wait for the answer</comment><comment x="31.999999999999886" y="1138.6999999999982" w="352.0000000000003" collapsed="false">Asynchronous client-server Hello World! with dynamic response topic (timer)</comment><script x="31.999999999999886" y="1207.0333333333313"><custom-block s="$cloudOutline MQTT request %s topic %s %br response topic %s payload %mlt %br on response run %cmdRing %mult%s"><l>broker.emqx.io</l><l>name</l><block s="getTimer"></block><l>hello</l><block s="reifyScript"><script><block s="doSayFor"><block var="payload"/><l>2</l></block></script><list><l>payload</l><l>topic</l></list></block><list></list></custom-block></script><comment x="514.9999999999995" y="1204.6999999999991" w="224.00000000000003" collapsed="false">Step 2 bis: Send a request (timer acts as idCall) and do not wait for the answer</comment><script x="28.99999999999966" y="225.20000000000007"><custom-block s="$cloudOutline MQTT connect to %s %mult%s"><l>broker.emqx.io</l><list></list></custom-block></script><script x="25.33333333333337" y="932.2000000000013"><custom-block s="$cloudOutline MQTT response %s topic %s %br reply %repRing %mult%s"><l>broker.emqx.io</l><l>name/#</l><block s="reifyReporter"><autolambda><custom-block s="$cloudOutline MQTT example response reporter payload %mlt topic %txt"><block var="payload"/><block var="topic"/></custom-block></autolambda><list><l>payload</l><l>topic</l></list></block><list></list></custom-block></script><comment x="26.999999999999886" y="685.6999999999981" w="372.0000000000004" collapsed="false">Asynchronous client-server Hello World! with static response topic (name2)</comment><script x="27.999999999999886" y="751.0333333333323"><custom-block s="$cloudOutline MQTT request %s topic %s %br response topic %s payload %mlt %br on response run %cmdRing %mult%s"><l>broker.emqx.io</l><l>name1</l><l>name2</l><l>hello</l><block s="reifyScript"><script><block s="doSayFor"><block var="payload"/><l>2</l></block></script><list><l>payload</l><l>topic</l></list></block><list><l>false</l></list></custom-block></script><comment x="28.999999999999886" y="412.36666666666696" w="361.99999999999994" collapsed="false">Synchronous client-server Hello World! with static response topic (name2)</comment></scripts></block-definition><block-definition s="sanitise options %&apos;data&apos; mask %&apos;mask&apos;" type="reporter" category="MQTT" helper="true"><comment x="0" y="0" w="226" collapsed="false">Modify V10 variadic defaults to be able to work for blank and psuedo (false/true) boolean entries&#xD;&#xD;Blank defaults are set as zero width spaces which are removed when block is executed&#xD;&#xD;This is needed for the connect block&#xD;&#xD;The options are then checked to see if they should be boolean and if they are not aready a boolean value, then they are replaced with boolean true if default is text &quot;true&quot;, otherwise boolean false.</comment><header></header><code></code><translations></translations><inputs><input type="%l" initial="1"></input><input type="%l" initial="1"></input></inputs><script><block s="doDeclareVariables"><list><l>zero width space</l></list></block><block s="doSetVar"><l>zero width space</l><block s="reportUnicodeAsLetter"><l>8203</l></block></block><block s="doSetVar"><l>data</l><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportIsA"><block var="value"/><l><option>text</option></l></block><block s="reportCombine"><block s="reportTextSplit"><block var="value"/><block var="zero width space"/></block><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><l></l><l></l></list></block></autolambda><list></list></block></block><block var="value"/></block></autolambda><list><l>value</l></list></block><block var="data"/></block></block><block s="doReport"><block s="reportListAttribute"><l><option>flatten</option></l><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportVariadicAnd"><list><block s="reportIsA"><block s="reportListItem"><l>2</l><block var="value"/></block><l><option>Boolean</option></l></block><block s="reportNot"><block s="reportIsA"><block s="reportListItem"><l>1</l><block var="value"/></block><l><option>Boolean</option></l></block></block></list></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><block var="value"/></block><l>true</l></list></block><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="reportListItem"><l>1</l><block var="value"/></block></block></autolambda><list><l>value</l><l>index</l></list></block><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block var="value"/><block s="reportListItem"><block var="index"/><block var="mask"/></block></list></block></autolambda><list><l>value</l><l>index</l></list></block><block var="data"/></block></block></block></block></script></block-definition></blocks><primitives></primitives><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" id="1005"><pentrails>data:image/png;base64,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</pentrails><costumes><list struct="atomic" id="1006"></list></costumes><sounds><list struct="atomic" id="1007"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="0"><sprite name="Sprite" idx="1" x="225" y="140" heading="90" scale="1" volume="100" pan="0" rotation="1" instrument="4"  draggable="true" hidden="true" costume="0" color="80,80,80,1" pen="tip" id="1012"><costumes><list struct="atomic" id="1013"></list></costumes><sounds><list struct="atomic" id="1014"></list></sounds><blocks></blocks><variables></variables><scripts><script x="32.66666666666666" y="29"><block s="receiveGo"></block><block s="clear"></block><block s="gotoXY"><l>50</l><l>160</l></block><block s="write"><l>enter/space: send message</l><l>12</l></block><block s="gotoXY"><l>120</l><l>140</l></block><block s="write"><l>l: new chatroom</l><l>12</l></block></script><comment x="291.66666666666674" y="42.999999999999886" w="92" collapsed="false">chatroom model. implement.</comment><script x="142.66666666666686" y="559.1666666666667"><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><block var="target"/><block var="message"/><list></list></custom-block></script><script x="450.66666666666686" y="172.99999999999852"><block s="doInsertInList"><l>thing</l><l>1</l><l/></block></script><script x="471.66666666666674" y="265.66666666666663"><block s="doSayFor"><l></l><l>2</l></block></script></scripts></sprite><watcher var="message" style="normal" x="9.999999999999773" y="73.00000599999994" color="243,118,29" hidden="true"/><watcher scope="Sprite" s="xPosition" style="normal" x="9.999999999999773" y="94.00000800000001" color="74,108,212" hidden="true"/><watcher var="message history" style="normal" x="4" y="29.000001999999995" color="243,118,29" extX="324" extY="279"/><watcher var="user" style="normal" x="4" y="336" color="243,118,29"/><watcher var="chatroom" style="normal" x="4" y="4" color="243,118,29"/></sprites></stage><variables><variable name="user"><l>the great skeeboop</l></variable><variable name="message"><l>–the great skeeboop: hello!</l></variable><variable name="message history"><list struct="atomic" id="1051">–Jam: Yo!,–the great skeeboop: hello!</list></variable><variable name="chatroom"><l>Snap!</l></variable></variables></scene></scenes></project><media name="messager: chatroom (cross project testing)" app="Snap! 11.0.8, https://snap.berkeley.edu" version="2"></media></snapdata>