<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" 
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel><title>rani/matterbridge.git</title><link>/rani/matterbridge.git</link><description>Commits on branch master</description><language>en-us</language><item>
<link>/rani/matterbridge.git/show/c6a927d4e3b7ced31aef7d6c3f1a4d86dc39283d</link>
<title>Change: strip redundant embeds in discord messages
</title>
<guid>c6a927d
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">c6a927d4e3b7ced31aef7d6c3f1a4d86dc39283d</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue Jun 09 13:22:11 2026 +0000</span>

<span class="git-message-line">    Change: strip redundant embeds in discord messages</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/inmessage.tengo</span> <span class="git-file-b">b/scripts/inmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">e9aec6c</span>..<span class="git-index-new">f06bc6d</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/inmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/inmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-369</span> <span class="git-hunk-new">+3624</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote := func(...reStrs) {</span>
<span class="git-message-line">     }</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>stripEmbed := func() {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if !text.contains(msgText, &#34; embed: &#34;) { return }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    re := text.re_compile(`^([^ ]+) embed: ([^ ]+)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if !re.match(msgText) { return }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    a := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    b := re.replace(msgText, &#34;$2&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if a == b {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        msgText = a</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>if msgText != &#34;&#34; {</span>
<span class="git-message-line">     if msgProtocol == &#34;discord&#34; {</span>
<span class="git-message-line">         doQuote(`(?s)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        stripEmbed()</span>
<span class="git-message-line">     } else if msgProtocol == &#34;xmpp&#34; {</span>
<span class="git-message-line">         doQuote(</span>
<span class="git-message-line">             `(?s)(.*?) \(in reply to (.*?) \[b]: (.*?)\)$`,</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Tue, 09 Jun 2026 18:22:11 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/526e1738e2792a69e080a71c3d66d3a2a6830941</link>
<title>Convert discord emoji URLs back into emojis
</title>
<guid>526e173
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">526e1738e2792a69e080a71c3d66d3a2a6830941</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue May 12 15:47:15 2026 +0000</span>

<span class="git-message-line">    Convert discord emoji URLs back into emojis</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/outmessage.tengo</span> <span class="git-file-b">b/scripts/outmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">7a0897e</span>..<span class="git-index-new">46f14d6</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-6410</span> <span class="git-hunk-new">+6416</span> <span class="git-hunk">@@</span><span class="git-function-context"> if inProtocol == &#34;irc&#34; &amp;&amp; outProtocol != &#34;irc&#34; {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// if we&#39;re not sending to a discord bridge,</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// then convert custom emoji tags into url&#39;s</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>if (inProtocol == &#34;discord&#34; &amp;&amp; outProtocol != &#34;discord&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    rePNG := text.re_compile(`&lt;:.*?:([0-9]+)&gt;`)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    msgText=rePNG.replace(msgText,&#34;https://cdn.discordapp.com/emojis/$1.png&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    reGIF := text.re_compile(`&lt;a:.*?:([0-9]+)&gt;`)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    msgText=reGIF.replace(msgText,&#34;https://cdn.discordapp.com/emojis/$1.gif&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    rePNG  := text.re_compile(`&lt;:.*?:([0-9]+)&gt;`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    msgText = rePNG.replace(msgText,&#34;https://cdn.discordapp.com/emojis/$1.png&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    reGIF  := text.re_compile(`&lt;a:.*?:([0-9]+)&gt;`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    msgText = reGIF.replace(msgText,&#34;https://cdn.discordapp.com/emojis/$1.gif&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// convert emoji URLs back into the emojis themselves on discord</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if (inProtocol != &#34;discord&#34; &amp;&amp; outProtocol == &#34;discord&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    rePNG  := text.re_compile(`https://cdn\.discordapp\.com/emojis/([0-9]+)\.png`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    msgText = rePNG.replace(msgText, &#34;&lt;:_:$1&gt;&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// format replies from all protocols to all protocols</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Tue, 12 May 2026 20:47:15 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/e17c6fd89de5c3fd61eb3b6ae5359600d5a954d5</link>
<title>Remove link embeds from quotes on discord
</title>
<guid>e17c6fd
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">e17c6fd89de5c3fd61eb3b6ae5359600d5a954d5</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue May 12 15:46:52 2026 +0000</span>

<span class="git-message-line">    Remove link embeds from quotes on discord</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/outmessage.tengo</span> <span class="git-file-b">b/scripts/outmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">8efeecd</span>..<span class="git-index-new">7a0897e</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-136</span> <span class="git-hunk-new">+1316</span> <span class="git-hunk">@@</span><span class="git-function-context"> text := import(&#34;text&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>fmt := import(&#34;fmt&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    // on discord, wrap links inside ctx with &lt;...&gt; to prevent embeds</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if outProtocol == &#34;discord&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        re := text.re_compile(</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(https?://(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[-a-zA-Z0-9]{1,16}\b[-a-zA-Z0-9@:%_+.~#?&amp;/=]*)`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        )</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        if re.match(ctx) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            ctx = re.replace(ctx, &#34;&lt;$1&gt;&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-message-line">     if outProtocol == &#34;xmpp&#34; || outProtocol == &#34;discord&#34; {</span>
<span class="git-message-line">         // split multiline context and prepend lines with a &#34;&gt;&#34;</span>
<span class="git-message-line">         ctx = text.join(text.split(ctx, &#34;\n&#34;), &#34;\n&gt; &#34;)</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Tue, 12 May 2026 20:46:52 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/5dcf4c97eca6dfbce93e645c3a4c759c6981a576</link>
<title>Fix: issues with multiline replies; strip newlines in text-based protocols
</title>
<guid>5dcf4c9
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">5dcf4c97eca6dfbce93e645c3a4c759c6981a576</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Sat Apr 18 18:13:06 2026 +0000</span>

<span class="git-message-line">    Fix: issues with multiline replies; strip newlines in text-based protocols</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/inmessage.tengo</span> <span class="git-file-b">b/scripts/inmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">27e4aa7</span>..<span class="git-index-new">e9aec6c</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/inmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/inmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-177</span> <span class="git-hunk-new">+177</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>stripQuote := func(ctx) {</span>
<span class="git-message-line">     re := text.re_compile(`(?m)^&gt; (?:-# )?↪ .+\n(?:&gt; .*\n)+(.*)`)</span>
<span class="git-message-line">     if re.match(ctx) { return re.replace(ctx, &#34;$1&#34;) }</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    re  = text.re_compile(`(?ms)^(.*?) \(in reply to .*?: .*\)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    re  = text.re_compile(`(?s)^(.*?) \(in reply to .*?: .*\)$`)</span>
<span class="git-message-line">     if re.match(ctx) { return re.replace(ctx, &#34;$1&#34;) }</span>
<span class="git-message-line">     return ctx</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-3816</span> <span class="git-hunk-new">+3816</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote := func(...reStrs) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>if msgText != &#34;&#34; {</span>
<span class="git-message-line">     if msgProtocol == &#34;discord&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        doQuote(`(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        doQuote(`(?s)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-message-line">     } else if msgProtocol == &#34;xmpp&#34; {</span>
<span class="git-message-line">         doQuote(</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>            `(?ms)(.*?) \(in reply to (.*?) \[b]: (.*?)\)$`,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>            `(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(?s)(.*?) \(in reply to (.*?) \[b]: (.*?)\)$`,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(?s)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-message-line">         )</span>
<span class="git-message-line">     } else if msgProtocol == &#34;telegram&#34; {</span>
<span class="git-message-line">         doQuote(</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>            `(?ms)(.*?) \(in reply to lulbridge: &lt;([^&gt;]+)&gt; (.*?)\)$`,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>            `(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(?s)(.*?) \(in reply to lulbridge: &lt;([^&gt;]+)&gt; (.*?)\)$`,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(?s)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-message-line">         )</span>
<span class="git-message-line">     }</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/outmessage.tengo</span> <span class="git-file-b">b/scripts/outmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">30b5dd4</span>..<span class="git-index-new">8efeecd</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-227</span> <span class="git-hunk-new">+228</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-message-line">                &#34;\n&gt; &#34; + ctx + &#34;\n&#34; +</span>
<span class="git-message-line">                reply</span>
<span class="git-message-line">     } else {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        return msgText</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        ctx = text.join(text.split(ctx, &#34;\n&#34;), &#34; &#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        return reply + &#34; (in reply to &#34; + nick + &#34;: &#34; + ctx + &#34;)&#34;</span>
<span class="git-message-line">     }</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-604</span> <span class="git-hunk-new">+614</span> <span class="git-hunk">@@</span><span class="git-function-context"> if (inProtocol == &#34;discord&#34; &amp;&amp; outProtocol != &#34;discord&#34;) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// format replies from all protocols to all protocols</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>doQuote(`(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>doQuote(`(?s)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Sat, 18 Apr 2026 23:13:06 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/84ad412d52fc8dc00f742523c03523e87f94e7d2</link>
<title>support stripping nested plaintext (unformatted) quotes
</title>
<guid>84ad412
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">84ad412d52fc8dc00f742523c03523e87f94e7d2</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Mon Mar 16 20:05:48 2026 +0000</span>

<span class="git-message-line">    support stripping nested plaintext (unformatted) quotes</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/inmessage.tengo</span> <span class="git-file-b">b/scripts/inmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">486c2ef</span>..<span class="git-index-new">27e4aa7</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/inmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/inmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-167</span> <span class="git-hunk-new">+1610</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>stripQuote := func(ctx) {</span>
<span class="git-message-line">     re := text.re_compile(`(?m)^&gt; (?:-# )?↪ .+\n(?:&gt; .*\n)+(.*)`)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    return re.replace(ctx, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if re.match(ctx) { return re.replace(ctx, &#34;$1&#34;) }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    re  = text.re_compile(`(?ms)^(.*?) \(in reply to .*?: .*\)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if re.match(ctx) { return re.replace(ctx, &#34;$1&#34;) }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    return ctx</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>doQuote := func(...reStrs) {</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Tue, 17 Mar 2026 01:05:48 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/1c90ba40930ad7203674a2c80f0f3e6a7495c36d</link>
<title>separate reply input parsing from reply output
</title>
<guid>1c90ba4
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">1c90ba40930ad7203674a2c80f0f3e6a7495c36d</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Mon Mar 16 15:41:08 2026 +0000</span>

<span class="git-message-line">    separate reply input parsing from reply output</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/inmessage.tengo</span> <span class="git-file-b">b/scripts/inmessage.tengo</span>
<span class="git-file-status-new">new file mode</span> <span class="git-mode-value">100644</span>
<span class="git-index">index</span> <span class="git-index-old">0000000</span>..<span class="git-index-new">486c2ef</span> <span class="git-index-mode"></span>
<span class="git-file-path----">---</span> <span class="git-file-location">/dev/null</span><span class="git-file-name"></span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/inmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-00</span> <span class="git-hunk-new">+150</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-added"><span class="git-diff-plus">+</span>/*</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>variables available</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>read-only:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span> msgUserID, msgAccount, msgChannel, msgProtocol</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>read-write:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span> msgText, msgUsername</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>*/</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>fmt  := import(&#34;fmt&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>text := import(&#34;text&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    return reply + &#34; (in reply to &#34; + nick + &#34;: &#34; + ctx + &#34;)&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>stripQuote := func(ctx) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    re := text.re_compile(`(?m)^&gt; (?:-# )?↪ .+\n(?:&gt; .*\n)+(.*)`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    return re.replace(ctx, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>doQuote := func(...reStrs) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    for reStr in reStrs {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        re := text.re_compile(reStr)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        if re.match(msgText) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            reply  := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            nick   := re.replace(msgText, &#34;$2&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            ctx    := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            ctx     = stripQuote(ctx)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            msgText = doQuote_(reply, nick, ctx)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            break</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if msgText != &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if msgProtocol == &#34;discord&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        doQuote(`(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    } else if msgProtocol == &#34;xmpp&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        doQuote(</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(?ms)(.*?) \(in reply to (.*?) \[b]: (.*?)\)$`,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        )</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    } else if msgProtocol == &#34;telegram&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        doQuote(</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(?ms)(.*?) \(in reply to lulbridge: &lt;([^&gt;]+)&gt; (.*?)\)$`,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            `(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        )</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/outmessage.tengo</span> <span class="git-file-b">b/scripts/outmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">8bea57d</span>..<span class="git-index-new">30b5dd4</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2125</span> <span class="git-hunk-new">+2111</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-message-line">         return prefix + nick +</span>
<span class="git-message-line">                &#34;\n&gt; &#34; + ctx + &#34;\n&#34; +</span>
<span class="git-message-line">                reply</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    } else if outProtocol == &#34;irc&#34;      ||</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>              outProtocol == &#34;telegram&#34; ||</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>              outProtocol == &#34;matrix&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        ctx = text.join(text.split(ctx, &#34;\n&#34;), &#34; &#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        return reply + &#34; (in reply to &#34; + nick + &#34;: &#34; + ctx + &#34;)&#34;</span>
<span class="git-message-line">     } else {</span>
<span class="git-message-line">         return msgText</span>
<span class="git-message-line">     }</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>stripQuote := func(ctx) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    // &gt; ↪ NICK</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    // &gt; ...</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    // &gt; ...</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    // ctx</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    re := text.re_compile(`(?m)^&gt; (?:-# )?↪ .+\n(?:&gt; .*\n)+(.*)`)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    return re.replace(ctx, &#34;$1&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// match $1 must be the reply</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// match $2 must be the nick</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// match $3 must be the context</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-507</span> <span class="git-hunk-new">+366</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote := func(...reStrs) {</span>
<span class="git-message-line">             reply  := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-message-line">             nick   := re.replace(msgText, &#34;$2&#34;)</span>
<span class="git-message-line">             ctx    := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>            ctx     = stripQuote(ctx)</span>
<span class="git-message-line">             msgText = doQuote_(reply, nick, ctx)</span>
<span class="git-message-line">             break</span>
<span class="git-message-line">         }</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-7421</span> <span class="git-hunk-new">+595</span> <span class="git-hunk">@@</span><span class="git-function-context"> if (inProtocol == &#34;discord&#34; &amp;&amp; outProtocol != &#34;discord&#34;) {</span>
<span class="git-message-line">     msgText=reGIF.replace(msgText,&#34;https://cdn.discordapp.com/emojis/$1.gif&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// format discord replies as quotes on xmpp</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>if (inProtocol == &#34;discord&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    doQuote(`(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>if (inProtocol == &#34;xmpp&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    doQuote(</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        `(?ms)(.*?) \(in reply to (.*?) \[b]: (.*?)\)$`,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        `(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    )</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>if (inProtocol == &#34;telegram&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    doQuote(</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        `(?ms)(.*?) \(in reply to lulbridge: &lt;([^&gt;]+)&gt; (.*?)\)$`,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        `(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    )</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// format replies from all protocols to all protocols</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>doQuote(`(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Mon, 16 Mar 2026 20:41:08 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/785a122508c569114ccfb70d61c8540c28715b35</link>
<title>strip nested replies
</title>
<guid>785a122
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">785a122508c569114ccfb70d61c8540c28715b35</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Mon Mar 16 14:47:13 2026 +0000</span>

<span class="git-message-line">    strip nested replies</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/outmessage.tengo</span> <span class="git-file-b">b/scripts/outmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">9a740f4</span>..<span class="git-index-new">8bea57d</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-217</span> <span class="git-hunk-new">+219</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-message-line">         return prefix + nick +</span>
<span class="git-message-line">                &#34;\n&gt; &#34; + ctx + &#34;\n&#34; +</span>
<span class="git-message-line">                reply</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    } else if outProtocol == &#34;irc&#34; || outProtocol == &#34;telegram&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    } else if outProtocol == &#34;irc&#34;      ||</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>              outProtocol == &#34;telegram&#34; ||</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>              outProtocol == &#34;matrix&#34; {</span>
<span class="git-message-line">         ctx = text.join(text.split(ctx, &#34;\n&#34;), &#34; &#34;)</span>
<span class="git-message-line">         return reply + &#34; (in reply to &#34; + nick + &#34;: &#34; + ctx + &#34;)&#34;</span>
<span class="git-message-line">     } else {</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-296</span> <span class="git-hunk-new">+3115</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-message-line">     }</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>stripQuote := func(ctx) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    // &gt; ↪ NICK</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    // &gt; ...</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    // &gt; ...</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    // ctx</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    re := text.re_compile(`(?m)^&gt; (?:-# )?↪ .+\n(?:&gt; .*\n)+(.*)`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    return re.replace(ctx, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// match $1 must be the reply</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// match $2 must be the nick</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// match $3 must be the context</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-369</span> <span class="git-hunk-new">+4710</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote := func(...reStrs) {</span>
<span class="git-message-line">     for reStr in reStrs {</span>
<span class="git-message-line">         re := text.re_compile(reStr)</span>
<span class="git-message-line">         if re.match(msgText) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>            reply := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>            nick  := re.replace(msgText, &#34;$2&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>            ctx   := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            reply  := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            nick   := re.replace(msgText, &#34;$2&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            ctx    := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            ctx     = stripQuote(ctx)</span>
<span class="git-message-line">             msgText = doQuote_(reply, nick, ctx)</span>
<span class="git-message-line">             break</span>
<span class="git-message-line">         }</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Mon, 16 Mar 2026 19:47:13 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/15a0eede375dc180bea3e77b649426f10f011302</link>
<title>patch in xmpp replies
</title>
<guid>15a0eed
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">15a0eede375dc180bea3e77b649426f10f011302</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Wed Feb 18 19:29:43 2026 +0000</span>

<span class="git-message-line">    patch in xmpp replies</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/config/config.go</span> <span class="git-file-b">b/bridge/config/config.go</span>
<span class="git-index">index</span> <span class="git-index-old">744ebfb</span>..<span class="git-index-new">efe3884</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/config/config.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/config/config.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2128</span> <span class="git-hunk-new">+2128</span> <span class="git-hunk">@@</span><span class="git-function-context"> type Protocol struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UseTLS                 bool       // IRC</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UseDiscriminator       bool       // discord</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UseFirstName           bool       // telegram</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	UseUserName            bool     // discord, matrix, mattermost</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	UsePerProtocolJID      bool     // xmpp</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	UseUserName            bool       // discord, matrix, mattermost</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	UsePerProtocolJID      bool       // xmpp</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UseInsecureURL         bool       // telegram</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UserName               string     // IRC</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	VerboseJoinPart        bool       // IRC</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/xmpp/xmpp.go</span> <span class="git-file-b">b/bridge/xmpp/xmpp.go</span>
<span class="git-index">index</span> <span class="git-index-old">be97699</span>..<span class="git-index-new">c0d585f</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/xmpp/xmpp.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/xmpp/xmpp.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-36</span> <span class="git-hunk-new">+37</span> <span class="git-hunk">@@</span><span class="git-function-context"> package bxmpp</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>import (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;crypto/sha1&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;encoding/hex&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;encoding/xml&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;fmt&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;strings&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;sync&#34;</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-156</span> <span class="git-hunk-new">+1643</span> <span class="git-hunk">@@</span><span class="git-function-context"> import (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;gosrc.io/xmpp/stanza&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>const xmppMsgCacheSize = 100</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>type xmppReply struct {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	XMLName xml.Name `xml:&#34;urn:xmpp:reply:0 reply&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	ID      string   `xml:&#34;id,attr&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	To      string   `xml:&#34;to,attr&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>type xmppStanzaID struct {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	XMLName xml.Name `xml:&#34;urn:xmpp:sid:0 stanza-id&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	ID      string   `xml:&#34;id,attr&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	By      string   `xml:&#34;by,attr&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>type xmppFallback struct {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	XMLName xml.Name         `xml:&#34;urn:xmpp:fallback:0 fallback&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	For     string           `xml:&#34;for,attr&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	Body    *xmppFallbackBody `xml:&#34;body&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>type xmppFallbackBody struct {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	Start int `xml:&#34;start,attr&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	End   int `xml:&#34;end,attr&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>type xmppCachedMessage struct {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	ID   string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	Nick string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	Body string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func init() {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{Space: &#34;urn:xmpp:reply:0&#34;, Local: &#34;reply&#34;}, xmppReply{})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{Space: &#34;urn:xmpp:sid:0&#34;, Local: &#34;stanza-id&#34;}, xmppStanzaID{})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{Space: &#34;urn:xmpp:fallback:0&#34;, Local: &#34;fallback&#34;}, xmppFallback{})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>type Bxmpp struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	*bridge.Config</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-296</span> <span class="git-hunk-new">+6711</span> <span class="git-hunk">@@</span><span class="git-function-context"> type Bxmpp struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	rooms       map[string]*mucRoom</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	connected   bool</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	reconnectCh chan struct{}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	cacheMu   sync.RWMutex</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	cacheRing []string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	cacheMap  map[string]xmppCachedMessage</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	cacheIdx  int</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>type mucRoom struct {</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-408</span> <span class="git-hunk-new">+8310</span> <span class="git-hunk">@@</span><span class="git-function-context"> type mucRoom struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func New(cfg *bridge.Config) bridge.Bridger {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return &amp;Bxmpp{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Config: cfg,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		rooms:  make(map[string]*mucRoom),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Config:    cfg,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		rooms:     make(map[string]*mucRoom),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		cacheRing: make([]string, 0, xmppMsgCacheSize),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		cacheMap:  make(map[string]xmppCachedMessage, xmppMsgCacheSize),</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1636</span> <span class="git-hunk-new">+20816</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bxmpp) handleMessage(s xmpp.Sender, p stanza.Packet) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	text := msg.Body</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	event := &#34;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if strings.HasPrefix(text, &#34;/me &#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		text = strings.TrimPrefix(text, &#34;/me &#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		event = config.EventUserAction</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	replyID := b.getReplyID(msg, roomJID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.cacheMessage(replyID, nick, text)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	if nick == room.BotNick {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-17012</span> <span class="git-hunk-new">+2257</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bxmpp) handleMessage(s xmpp.Sender, p stanza.Packet) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	text := msg.Body</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	event := &#34;&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if strings.HasPrefix(text, &#34;/me &#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		text = strings.TrimPrefix(text, &#34;/me &#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		event = config.EventUserAction</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	text = b.handleQuote(msg, text)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	rmsg := config.Message{</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		Username: nick,</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1887</span> <span class="git-hunk-new">+238106</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bxmpp) handleMessage(s xmpp.Sender, p stanza.Packet) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.Remote &lt;- rmsg</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) getReplyID(msg stanza.Message, roomJID string) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.Type != stanza.MessageTypeGroupchat {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return &#34;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	var sid xmppStanzaID</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.Get(&amp;sid) &amp;&amp; sid.ID != &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if bareJID(sid.By) == roomJID {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			return sid.ID</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return &#34;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) stripReplyFallback(msg stanza.Message, text string) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	var fb xmppFallback</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if !msg.Get(&amp;fb) || fb.For != &#34;urn:xmpp:reply:0&#34; || fb.Body == nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return text</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return removeRuneRange(text, fb.Body.Start, fb.Body.End)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) cacheMessage(id, nick, body string) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if id == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.cacheMu.Lock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	defer b.cacheMu.Unlock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	entry := xmppCachedMessage{ID: id, Nick: nick, Body: body}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if _, exists := b.cacheMap[id]; exists {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.cacheMap[id] = entry</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if len(b.cacheRing) &lt; xmppMsgCacheSize {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.cacheRing = append(b.cacheRing, id)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.cacheMap[id] = entry</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	evictID := b.cacheRing[b.cacheIdx]</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	delete(b.cacheMap, evictID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.cacheRing[b.cacheIdx] = id</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.cacheMap[id] = entry</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.cacheIdx = (b.cacheIdx + 1) % xmppMsgCacheSize</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) findCachedMessage(id string) (xmppCachedMessage, bool) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.cacheMu.RLock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	defer b.cacheMu.RUnlock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	msg, ok := b.cacheMap[id]</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return msg, ok</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) handleQuote(msg stanza.Message, text string) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.GetBool(&#34;QuoteDisable&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return text</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	var reply xmppReply</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if !msg.Get(&amp;reply) || reply.ID == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return text</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Debugf(&#34;XMPP reply details: id=%s to=%s&#34;, reply.ID, reply.To)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	cached, ok := b.findCachedMessage(reply.ID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if !ok {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return text</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	text = b.stripReplyFallback(msg, text)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	quoteMessage := cached.Body</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	quoteNick := cached.Nick</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	format := b.GetString(&#34;quoteformat&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if format == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		format = &#34;{MESSAGE} (re @{QUOTENICK}: {QUOTEMESSAGE})&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	limit := b.GetInt(&#34;QuoteLengthLimit&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if limit != 0 {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		runes := []rune(quoteMessage)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if len(runes) &gt; limit {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			quoteMessage = string(runes[:limit]) + &#34;...&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	replacer := strings.NewReplacer(</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		&#34;{MESSAGE}&#34;, text,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		&#34;{QUOTENICK}&#34;, quoteNick,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		&#34;{QUOTEMESSAGE}&#34;, quoteMessage,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return replacer.Replace(format)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bxmpp) ensureRoom(channel string) *mucRoom {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.mu.Lock()</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-3886</span> <span class="git-hunk-new">+53724</span> <span class="git-hunk">@@</span><span class="git-function-context"> func parseRoomNick(from string) (string, string) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return parts[0], parts[1]</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func bareJID(jid string) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if i := strings.Index(jid, &#34;/&#34;); i &gt;= 0 {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return jid[:i]</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return jid</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func removeRuneRange(text string, start, end int) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if start &lt; 0 || end &lt;= start {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return text</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	runes := []rune(text)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if start &gt; len(runes) || end &gt; len(runes) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return text</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return string(append(runes[:start], runes[end:]...))</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bxmpp) setConnected(state bool) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.Lock()</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.connected = state</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/outmessage.tengo</span> <span class="git-file-b">b/scripts/outmessage.tengo</span>
<span class="git-index">index</span> <span class="git-index-old">c2ce556</span>..<span class="git-index-new">9a740f4</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1212</span> <span class="git-hunk-new">+1213</span> <span class="git-hunk">@@</span><span class="git-function-context"> read-write:</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>text := import(&#34;text&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>fmt := import(&#34;fmt&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>doQuote := func(reply, nick, ctx) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>doQuote_ := func(reply, nick, ctx) {</span>
<span class="git-message-line">     if outProtocol == &#34;xmpp&#34; || outProtocol == &#34;discord&#34; {</span>
<span class="git-message-line">         // split multiline context and prepend lines with a &#34;&gt;&#34;</span>
<span class="git-message-line">         ctx = text.join(text.split(ctx, &#34;\n&#34;), &#34;\n&gt; &#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        return &#34;↪ &#34; + nick +</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        prefix := &#34;&gt; ↪ &#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        if outProtocol == &#34;discord&#34; { prefix = &#34;&gt; -# ↪ &#34; }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        return prefix + nick +</span>
<span class="git-message-line">                &#34;\n&gt; &#34; + ctx + &#34;\n&#34; +</span>
<span class="git-message-line">                reply</span>
<span class="git-message-line">     } else if outProtocol == &#34;irc&#34; || outProtocol == &#34;telegram&#34; {</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-286</span> <span class="git-hunk-new">+2922</span> <span class="git-hunk">@@</span><span class="git-function-context"> doQuote := func(reply, nick, ctx) {</span>
<span class="git-message-line">     }</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// match $1 must be the reply</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// match $2 must be the nick</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// match $3 must be the context</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>doQuote := func(...reStrs) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    for reStr in reStrs {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        re := text.re_compile(reStr)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        if re.match(msgText) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            reply := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            nick  := re.replace(msgText, &#34;$2&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            ctx   := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            msgText = doQuote_(reply, nick, ctx)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>            break</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// start - strip irc colors </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// if we&#39;re not sending to an irc bridge we strip the IRC colors</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>if inProtocol == &#34;irc&#34; &amp;&amp; outProtocol != &#34;irc&#34; {</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-4622</span> <span class="git-hunk-new">+6320</span> <span class="git-hunk">@@</span><span class="git-function-context"> if (inProtocol == &#34;discord&#34; &amp;&amp; outProtocol != &#34;discord&#34;) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// format discord replies as quotes on xmpp</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>if (inProtocol == &#34;discord&#34; &amp;&amp; outProtocol != &#34;discord&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    re := text.re_compile(`(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    if re.match(msgText) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        reply := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        nick  := re.replace(msgText, &#34;$2&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        ctx   := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        msgText = doQuote(reply, nick, ctx)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if (inProtocol == &#34;discord&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    doQuote(`(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>if (inProtocol == &#34;telegram&#34; &amp;&amp; outProtocol != &#34;telegram&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    re := text.re_compile(`(?ms)(.*?) \(in reply to (.*?): &lt;([^&gt;]+)&gt; (.*?)\)$`)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    if re.match(msgText) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        reply := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        nick  := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        ctx   := re.replace(msgText, &#34;$4&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        msgText = doQuote(reply, nick, ctx)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if (inProtocol == &#34;xmpp&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    doQuote(</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        `(?ms)(.*?) \(in reply to (.*?) \[b]: (.*?)\)$`,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        `(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    )</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if (inProtocol == &#34;telegram&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    doQuote(</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        `(?ms)(.*?) \(in reply to lulbridge: &lt;([^&gt;]+)&gt; (.*?)\)$`,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        `(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    )</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Thu, 19 Feb 2026 01:29:43 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/6bab3371812e0684a560b14add9660274ed721bc</link>
<title>add outmessage.tengo
</title>
<guid>6bab337
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">6bab3371812e0684a560b14add9660274ed721bc</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue Feb 17 20:00:24 2026 +0000</span>

<span class="git-message-line">    add outmessage.tengo</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/scripts/outmessage.tengo</span> <span class="git-file-b">b/scripts/outmessage.tengo</span>
<span class="git-file-status-new">new file mode</span> <span class="git-mode-value">100644</span>
<span class="git-index">index</span> <span class="git-index-old">0000000</span>..<span class="git-index-new">c2ce556</span> <span class="git-index-mode"></span>
<span class="git-file-path----">---</span> <span class="git-file-location">/dev/null</span><span class="git-file-name"></span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">scripts/outmessage.tengo</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-00</span> <span class="git-hunk-new">+167</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-added"><span class="git-diff-plus">+</span>/*</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>variables available </span>
<span class="git-line-added"><span class="git-diff-plus">+</span>read-only:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span> inAccount, inProtocol, inChannel, inGateway, inEvent</span>
<span class="git-line-added"><span class="git-diff-plus">+</span> outAccount, outProtocol, outChannel, outGateway, outEvent</span>
<span class="git-line-added"><span class="git-diff-plus">+</span> msgUserID</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>read-write:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span> msgDrop, msgText, msgUsername</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>*/</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>text := import(&#34;text&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>fmt := import(&#34;fmt&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>doQuote := func(reply, nick, ctx) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if outProtocol == &#34;xmpp&#34; || outProtocol == &#34;discord&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        // split multiline context and prepend lines with a &#34;&gt;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        ctx = text.join(text.split(ctx, &#34;\n&#34;), &#34;\n&gt; &#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        return &#34;↪ &#34; + nick +</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>               &#34;\n&gt; &#34; + ctx + &#34;\n&#34; +</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>               reply</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    } else if outProtocol == &#34;irc&#34; || outProtocol == &#34;telegram&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        ctx = text.join(text.split(ctx, &#34;\n&#34;), &#34; &#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        return reply + &#34; (in reply to &#34; + nick + &#34;: &#34; + ctx + &#34;)&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    } else {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        return msgText</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// start - strip irc colors </span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// if we&#39;re not sending to an irc bridge we strip the IRC colors</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if inProtocol == &#34;irc&#34; &amp;&amp; outProtocol != &#34;irc&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    re := text.re_compile(`\x03(?:\d{1,2}(?:,\d{1,2})?)?|[[:cntrl:]]`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    msgText=re.replace(msgText,&#34;&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// end - strip irc colors</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// if we&#39;re not sending to a discord bridge,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// then convert custom emoji tags into url&#39;s</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if (inProtocol == &#34;discord&#34; &amp;&amp; outProtocol != &#34;discord&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    rePNG := text.re_compile(`&lt;:.*?:([0-9]+)&gt;`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    msgText=rePNG.replace(msgText,&#34;https://cdn.discordapp.com/emojis/$1.png&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    reGIF := text.re_compile(`&lt;a:.*?:([0-9]+)&gt;`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    msgText=reGIF.replace(msgText,&#34;https://cdn.discordapp.com/emojis/$1.gif&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// format discord replies as quotes on xmpp</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if (inProtocol == &#34;discord&#34; &amp;&amp; outProtocol != &#34;discord&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    re := text.re_compile(`(?ms)(.*?) \(in reply to (.*?): (.*?)\)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if re.match(msgText) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        reply := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        nick  := re.replace(msgText, &#34;$2&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        ctx   := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        msgText = doQuote(reply, nick, ctx)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>if (inProtocol == &#34;telegram&#34; &amp;&amp; outProtocol != &#34;telegram&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    re := text.re_compile(`(?ms)(.*?) \(in reply to (.*?): &lt;([^&gt;]+)&gt; (.*?)\)$`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    if re.match(msgText) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        reply := re.replace(msgText, &#34;$1&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        nick  := re.replace(msgText, &#34;$3&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        ctx   := re.replace(msgText, &#34;$4&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        msgText = doQuote(reply, nick, ctx)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    }</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Wed, 18 Feb 2026 02:00:24 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/7cfe0d24345a3b7621d6959535abef6b44baab94</link>
<title>Add config
</title>
<guid>7cfe0d2
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">7cfe0d24345a3b7621d6959535abef6b44baab94</span> <span class="git-refs"></span>
Author: rani &lt;clagv.randomgames@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue Feb 17 15:19:23 2026 +0000</span>

<span class="git-message-line">    Add config</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/config/config.go</span> <span class="git-file-b">b/bridge/config/config.go</span>
<span class="git-index">index</span> <span class="git-index-old">37a99eb</span>..<span class="git-index-new">744ebfb</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/config/config.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/config/config.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1789</span> <span class="git-hunk-new">+1789</span> <span class="git-hunk">@@</span><span class="git-function-context"> type Protocol struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	PrefixMessagesWithNick bool       // mattemost, slack</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	PreserveThreading      bool       // slack</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	Protocol               string     // all protocols</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	QuoteDisable           bool       // telegram</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	QuoteFormat            string     // telegram</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	QuoteLengthLimit       int        // telegram</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	QuoteDisable           bool       // telegram, discord</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	QuoteFormat            string     // telegram, discord</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	QuoteLengthLimit       int        // telegram, discord</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	RealName               string     // IRC</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	RecoveryKey            string     // matrix</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	RejoinDelay            int        // IRC</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2127</span> <span class="git-hunk-new">+2128</span> <span class="git-hunk">@@</span><span class="git-function-context"> type Protocol struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UseTLS                 bool       // IRC</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UseDiscriminator       bool       // discord</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UseFirstName           bool       // telegram</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	UseUserName            bool       // discord, matrix, mattermost</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	UseUserName            bool     // discord, matrix, mattermost</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	UsePerProtocolJID      bool     // xmpp</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UseInsecureURL         bool       // telegram</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UserName               string     // IRC</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	VerboseJoinPart        bool       // IRC</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/discord/handlers.go</span> <span class="git-file-b">b/bridge/discord/handlers.go</span>
<span class="git-index">index</span> <span class="git-index-old">dc3480e</span>..<span class="git-index-new">a39acd4</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/discord/handlers.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/discord/handlers.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-16</span> <span class="git-hunk-new">+19</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>package bdiscord</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>import (</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;time&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;strings&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/bwmarrin/discordgo&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/davecgh/go-spew/spew&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/config&#34;</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-746</span> <span class="git-hunk-new">+7712</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdat</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	// only when message is actually edited</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	if m.Message.EditedTimestamp != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		// don&#39;t relay old edits</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		// there are often spurrious &#34;ghost&#34; messages</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		delay := time.Now().Sub(*m.Message.EditedTimestamp)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if delay &gt;= time.Duration(6) * time.Hour {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			return</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		b.Log.Debugf(&#34;Sending edit message&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		m.Content += b.GetString(&#34;EditSuffix&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		msg := &amp;discordgo.MessageCreate{</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-836</span> <span class="git-hunk-new">+9250</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdat</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bdiscord) handleQuote(s *discordgo.Session, m *discordgo.Message, msg string) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.GetBool(&#34;QuoteDisable&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return msg</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if m.MessageReference == nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return msg</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	refMsgRef := m.MessageReference</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	refMsg, err := s.ChannelMessage(refMsgRef.ChannelID, refMsgRef.MessageID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.Log.Errorf(&#34;Error getting quoted message %s:%s: %s&#34;, refMsgRef.ChannelID, refMsgRef.MessageID, err)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return msg</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	quoteMessage := refMsg.Content</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	quoteNick := b.getNick(refMsg.Author, refMsg.GuildID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	fromWebhook := m.WebhookID != &#34;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if !fromWebhook &amp;&amp; b.GetBool(&#34;UseDiscriminator&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		quoteNick += &#34;#&#34; + refMsg.Author.Discriminator</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	format := b.GetString(&#34;quoteformat&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if format == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		format = &#34;{MESSAGE} (re @{QUOTENICK}: {QUOTEMESSAGE})&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	quoteMessagelength := len([]rune(quoteMessage))</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.GetInt(&#34;QuoteLengthLimit&#34;) != 0 &amp;&amp; quoteMessagelength &gt;= b.GetInt(&#34;QuoteLengthLimit&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		runes := []rune(quoteMessage)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		quoteMessage = string(runes[0:b.GetInt(&#34;QuoteLengthLimit&#34;)])</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if quoteMessagelength &gt; b.GetInt(&#34;QuoteLengthLimit&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			quoteMessage += &#34;...&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	replacer := strings.NewReplacer(</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		&#34;{MESSAGE}&#34;, msg,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		&#34;{QUOTENICK}&#34;, quoteNick,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		&#34;{QUOTEMESSAGE}&#34;, quoteMessage,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	format = replacer.Replace(format)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return format</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { //nolint:unparam</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	if m.GuildID != b.guildID {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		b.Log.Debugf(&#34;Ignoring messageCreate because it originates from a different guild&#34;)</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1827</span> <span class="git-hunk-new">+23510</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	// Replace emotes</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	rmsg.Text = replaceEmotes(rmsg.Text)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>//	rmsg.Text = replaceEmotes(rmsg.Text)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	// Handle Reply thread</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	rmsg.Text = b.handleQuote(s, m.Message, rmsg.Text)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	// Add our parent id if it exists, and if it&#39;s not referring to a message in another channel</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	if ref := m.MessageReference; ref != nil &amp;&amp; ref.ChannelID == m.ChannelID {</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2877</span> <span class="git-hunk-new">+34316</span> <span class="git-hunk">@@</span><span class="git-function-context"> func handleEmbed(embed *discordgo.MessageEmbed) string {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	t = append(t, embed.Title)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	t = append(t, embed.Description)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	for _, f := range embed.Fields {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		field := f.Name + &#34;: &#34; + f.Value</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		t = append(t, field)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	t = append(t, embed.URL)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if embed.Footer != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		t = append(t, embed.Footer.Text)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	i := 0</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	for _, e := range t {</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-3017</span> <span class="git-hunk-new">+3667</span> <span class="git-hunk">@@</span><span class="git-function-context"> func handleEmbed(embed *discordgo.MessageEmbed) string {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			continue</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		result += &#34; - &#34; + e</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		result += &#34;\n&#34; + e</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	if result != &#34;&#34; {</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/xmpp/handler.go</span> <span class="git-file-b">b/bridge/xmpp/handler.go</span>
<span class="git-file-status-deleted">deleted file mode</span> <span class="git-mode-value">100644</span>
<span class="git-index">index</span> <span class="git-index-old">dd7f578</span>..<span class="git-index-new">0000000</span> <span class="git-index-mode"></span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/xmpp/handler.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">/dev/null</span><span class="git-file-name"></span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-134</span> <span class="git-hunk-new">+00</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>package bxmpp</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>import (</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/config&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/helper&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;github.com/xmppo/go-xmpp&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// handleDownloadAvatar downloads the avatar of userid from channel</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// sends a EVENT_AVATAR_DOWNLOAD message to the gateway if successful.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// logs an error message if it fails</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) handleDownloadAvatar(avatar xmpp.AvatarData) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	rmsg := config.Message{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Username: &#34;system&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Text:     &#34;avatar&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Channel:  b.parseChannel(avatar.From),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Account:  b.Account,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		UserID:   avatar.From,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Event:    config.EventAvatarDownload,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Extra:    make(map[string][]interface{}),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if _, ok := b.avatarMap[avatar.From]; !ok {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Debugf(&#34;Avatar.From: %s&#34;, avatar.From)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		err := helper.HandleDownloadSize(b.Log, &amp;rmsg, avatar.From+&#34;.png&#34;, int64(len(avatar.Data)), b.General)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Log.Error(err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			return</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		helper.HandleDownloadData(b.Log, &amp;rmsg, avatar.From+&#34;.png&#34;, rmsg.Text, &#34;&#34;, &amp;avatar.Data, b.General)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Debugf(&#34;Avatar download complete&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Remote &lt;- rmsg</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/xmpp/helpers.go</span> <span class="git-file-b">b/bridge/xmpp/helpers.go</span>
<span class="git-file-status-deleted">deleted file mode</span> <span class="git-mode-value">100644</span>
<span class="git-index">index</span> <span class="git-index-old">562d705</span>..<span class="git-index-new">0000000</span> <span class="git-index-mode"></span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/xmpp/helpers.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">/dev/null</span><span class="git-file-name"></span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-130</span> <span class="git-hunk-new">+00</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>package bxmpp</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>import (</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;regexp&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/config&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>var pathRegex = regexp.MustCompile(&#34;[^a-zA-Z0-9]+&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// GetAvatar constructs a URL for a given user-avatar if it is available in the cache.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func getAvatar(av map[string]string, userid string, general *config.Protocol) string {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if hash, ok := av[userid]; ok {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		// NOTE: This does not happen in bridge/helper/helper.go but messes up XMPP</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		id := pathRegex.ReplaceAllString(userid, &#34;_&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return general.MediaServerDownload + &#34;/&#34; + hash + &#34;/&#34; + id + &#34;.png&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return &#34;&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) cacheAvatar(msg *config.Message) string {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	fi := msg.Extra[&#34;file&#34;][0].(config.FileInfo)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	/* if we have a sha we have successfully uploaded the file to the media server,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	so we can now cache the sha */</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if fi.SHA != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Debugf(&#34;Added %s to %s in avatarMap&#34;, fi.SHA, msg.UserID)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.avatarMap[msg.UserID] = fi.SHA</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return &#34;&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/xmpp/xmpp.go</span> <span class="git-file-b">b/bridge/xmpp/xmpp.go</span>
<span class="git-index">index</span> <span class="git-index-old">a51baec</span>..<span class="git-index-new">be97699</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/xmpp/xmpp.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/xmpp/xmpp.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-112</span> <span class="git-hunk-new">+19</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>package bxmpp</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>import (</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;bytes&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;crypto/tls&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;encoding/json&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;crypto/sha1&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;encoding/hex&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;fmt&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;net/http&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;net/url&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;strings&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;sync&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;time&#34;</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-14440</span> <span class="git-hunk-new">+11387</span> <span class="git-hunk">@@</span><span class="git-function-context"> import (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/jpillora/backoff&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/bridge&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/config&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/helper&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;github.com/rs/xid&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;github.com/xmppo/go-xmpp&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;gosrc.io/xmpp&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;gosrc.io/xmpp/stanza&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>type Bxmpp struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	*bridge.Config</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	startTime time.Time</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	xc        *xmpp.Client</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	xmppMap   map[string]string</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	connected bool</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	sync.RWMutex</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	component *xmpp.Component</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	router    *xmpp.Router</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	avatarAvailability map[string]bool</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	avatarMap          map[string]string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	domain    string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	mucDomain string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	botNick   string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	mu          sync.RWMutex</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	rooms       map[string]*mucRoom</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	connected   bool</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	reconnectCh chan struct{}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>type mucRoom struct {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	Channel     string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	MucJID      string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	BotNick     string</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	PuppetNicks map[string]string</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func New(cfg *bridge.Config) bridge.Bridger {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return &amp;Bxmpp{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Config:             cfg,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		xmppMap:            make(map[string]string),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		avatarAvailability: make(map[string]bool),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		avatarMap:          make(map[string]string),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Config: cfg,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		rooms:  make(map[string]*mucRoom),</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bxmpp) Connect() error {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.Log.Infof(&#34;Connecting %s&#34;, b.GetString(&#34;Server&#34;))</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err := b.createXMPP(); err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Debugf(&#34;%#v&#34;, err)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.domain = b.GetString(&#34;Domain&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.domain == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return fmt.Errorf(&#34;xmpp Domain is required for component gateway&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.mucDomain = b.GetString(&#34;Muc&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.mucDomain == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.mucDomain = &#34;muc.&#34; + b.domain</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.botNick = b.GetString(&#34;Nick&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.botNick == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.botNick = &#34;matterbridge&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Debugf(&#34;XMPP component config: server=%s domain=%s muc=%s bot=%s&#34;, b.GetString(&#34;Server&#34;), b.domain, b.mucDomain, b.botNick)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.reconnectCh = make(chan struct{}, 1)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	opts := xmpp.ComponentOptions{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		TransportConfiguration: xmpp.TransportConfiguration{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			Address: b.GetString(&#34;Server&#34;),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			Domain:  b.domain,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		},</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Domain: b.domain,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Secret: b.GetString(&#34;Secret&#34;),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Name:   &#34;matterbridge&#34;,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.router = xmpp.NewRouter()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.router.HandleFunc(&#34;message&#34;, b.handleMessage)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Debug(&#34;XMPP component: creating component&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	component, err := xmpp.NewComponent(opts, b.router, func(err error) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.handleComponentError(err)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		return err</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.component = component</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.Log.Info(&#34;Connection succeeded&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err := b.component.Connect(); err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.setConnected(true)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	go b.manageConnection()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Info(&#34;XMPP component connected&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return nil</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bxmpp) Disconnect() error {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.leaveAllRooms()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.reconnectCh != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		close(b.reconnectCh)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.reconnectCh = nil</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.setConnected(false)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return nil</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bxmpp) JoinChannel(channel config.ChannelInfo) error {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if channel.Options.Key != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Debugf(&#34;using key %s for channel %s&#34;, channel.Options.Key, channel.Name)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.xc.JoinProtectedMUC(channel.Name+&#34;@&#34;+b.GetString(&#34;Muc&#34;), b.GetString(&#34;Nick&#34;), channel.Options.Key, xmpp.NoHistory, 0, nil)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	} else {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.xc.JoinMUCNoHistory(channel.Name+&#34;@&#34;+b.GetString(&#34;Muc&#34;), b.GetString(&#34;Nick&#34;))</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return nil</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	room := b.ensureRoom(channel.Name)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Debugf(&#34;XMPP join MUC: channel=%s muc=%s bot=%s&#34;, room.Channel, room.MucJID, room.BotNick)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return b.joinMuc(room.MucJID, room.BotNick, b.botJID())</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bxmpp) Send(msg config.Message) (string, error) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// should be fixed by using a cache instead of dropping</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	if !b.Connected() {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return &#34;&#34;, fmt.Errorf(&#34;bridge %s not connected, dropping message %#v to bridge&#34;, b.Account, msg)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.Log.Warnf(&#34;XMPP not connected, dropping message on bridge %s&#34;, b.Account)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return &#34;&#34;, fmt.Errorf(&#34;bridge %s not connected, dropping message&#34;, b.Account)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// ignore delete messages</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if msg.Event == config.EventMsgDelete {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.Event == config.EventMsgDelete || msg.Event == config.EventAvatarDownload {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return &#34;&#34;, nil</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.Event != &#34;&#34; &amp;&amp; msg.Event != config.EventUserAction {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		return &#34;&#34;, nil</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.Log.Debugf(&#34;=&gt; Receiving %#v&#34;, msg)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	room := b.ensureRoom(msg.Channel)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	puppetJID, _ := b.ensurePuppet(room, msg.Username, msg.UserID, msg.Protocol)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if msg.Event == config.EventAvatarDownload {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return b.cacheAvatar(&amp;msg), nil</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	body := msg.Text</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.Event == config.EventUserAction {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		body = &#34;/me &#34; + body</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// Make a action /me of the message, prepend the username with it.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// https://xmpp.org/extensions/xep-0245.html</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if msg.Event == config.EventUserAction {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		msg.Username = &#34;/me &#34; + msg.Username</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// Upload a file (in XMPP case send the upload URL because XMPP has no native upload support).</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	var err error</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if msg.Extra != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		for _, rmsg := range helper.HandleExtra(&amp;msg, b.General) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Log.Debugf(&#34;=&gt; Sending attachement message %#v&#34;, rmsg)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if b.GetString(&#34;WebhookURL&#34;) != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				err = b.postSlackCompatibleWebhook(msg)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			} else {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				_, err = b.xc.Send(xmpp.Chat{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Type:   &#34;groupchat&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Remote: rmsg.Channel + &#34;@&#34; + b.GetString(&#34;Muc&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Text:   rmsg.Username + rmsg.Text,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				})</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return &#34;&#34;, b.sendMucMessage(room.MucJID, puppetJID, body)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.Log.WithError(err).Error(&#34;Unable to send message with share URL.&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if len(msg.Extra[&#34;file&#34;]) &gt; 0 {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			return &#34;&#34;, b.handleUploadFile(&amp;msg)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) handleMessage(s xmpp.Sender, p stanza.Packet) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	msg, ok := p.(stanza.Message)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if !ok {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.Type != stanza.MessageTypeGroupchat {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.Body == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.To != b.botJID() {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if b.GetString(&#34;WebhookURL&#34;) != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Debugf(&#34;Sending message using Webhook&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		err := b.postSlackCompatibleWebhook(msg)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Log.Errorf(&#34;Failed to send message using webhook: %s&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			return &#34;&#34;, err</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Debugf(&#34;XMPP recv message: from=%s to=%s type=%s id=%s body_len=%d&#34;, msg.From, msg.To, msg.Type, msg.Id, len(msg.Body))</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return &#34;&#34;, nil</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	roomJID, nick := parseRoomNick(msg.From)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if roomJID == &#34;&#34; || nick == &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// Post normal message.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.Log.Debugf(&#34;=&gt; Sending message %#v&#34;, msg)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if _, err := b.xc.Send(xmpp.Chat{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Type:   &#34;groupchat&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Remote: msg.Channel + &#34;@&#34; + b.GetString(&#34;Muc&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Text:   msg.Username + msg.Text,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}); err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return &#34;&#34;, err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	room := b.getRoomByJID(roomJID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if room == nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// Generate a dummy ID because to avoid collision with other internal messages</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// However this does not provide proper Edits/Replies integration on XMPP side.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	msgID := xid.New().String()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return msgID, nil</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) postSlackCompatibleWebhook(msg config.Message) error {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	type XMPPWebhook struct {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Username string `json:&#34;username&#34;`</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Text     string `json:&#34;text&#34;`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if nick == room.BotNick {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	webhookBody, err := json.Marshal(XMPPWebhook{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Username: msg.Username,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Text:     msg.Text,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	})</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Errorf(&#34;Failed to marshal webhook: %s&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if _, ok := room.PuppetNicks[nick]; ok {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	resp, err := http.Post(b.GetString(&#34;WebhookURL&#34;)+&#34;/&#34;+url.QueryEscape(msg.Channel), &#34;application/json&#34;, bytes.NewReader(webhookBody))</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Errorf(&#34;Failed to POST webhook: %s&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	text := msg.Body</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	event := &#34;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if strings.HasPrefix(text, &#34;/me &#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		text = strings.TrimPrefix(text, &#34;/me &#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		event = config.EventUserAction</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	resp.Body.Close()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return nil</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	rmsg := config.Message{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Username: nick,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Text:     text,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Channel:  room.Channel,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Account:  b.Account,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		UserID:   msg.From,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Event:    event,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Remote &lt;- rmsg</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) createXMPP() error {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// TODO: remove in release after first community fork release (N+2)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if b.GetBool(&#34;NoTLS&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Fatalf(&#34;NoTLS setting has been deprecated. If you&#39;d like to disable StartTLS and start a plaintext connection, use NoStartTLS instead.&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	var serverName string</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	switch {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	case !b.GetBool(&#34;Anonymous&#34;):</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if !strings.Contains(b.GetString(&#34;Jid&#34;), &#34;@&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			return fmt.Errorf(&#34;the Jid %s doesn&#39;t contain an @&#34;, b.GetString(&#34;Jid&#34;))</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		serverName = strings.Split(b.GetString(&#34;Jid&#34;), &#34;@&#34;)[1]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	case !strings.Contains(b.GetString(&#34;Server&#34;), &#34;:&#34;):</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		serverName = strings.Split(b.GetString(&#34;Server&#34;), &#34;:&#34;)[0]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	default:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		serverName = b.GetString(&#34;Server&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	tc := &amp;tls.Config{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		ServerName:         serverName,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		InsecureSkipVerify: b.GetBool(&#34;SkipTLSVerify&#34;), // nolint: gosec</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	options := xmpp.Options{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Host:                         b.GetString(&#34;Server&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		User:                         b.GetString(&#34;Jid&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Password:                     b.GetString(&#34;Password&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		NoTLS:                        !b.GetBool(&#34;UseDirectTLS&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		StartTLS:                     !b.GetBool(&#34;NoStartTLS&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		TLSConfig:                    tc,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Debug:                        b.GetBool(&#34;debug&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Session:                      true,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Status:                       &#34;&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		StatusMessage:                &#34;&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Resource:                     &#34;&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		InsecureAllowUnencryptedAuth: !b.GetBool(&#34;UseDirectTLS&#34;) &amp;&amp; b.GetBool(&#34;NoStartTLS&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		DebugWriter:                  b.Log.Writer(),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Mechanism:                    b.GetString(&#34;Mechanism&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		NoPLAIN:                      b.GetBool(&#34;NoPLAIN&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	var err error</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.xc, err = options.NewClient()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return err</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) manageConnection() {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.setConnected(true)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	initial := true</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	bf := &amp;backoff.Backoff{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Min:    time.Second,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Max:    5 * time.Minute,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Jitter: true,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) ensureRoom(channel string) *mucRoom {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.mu.Lock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	defer b.mu.Unlock()</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// Main connection loop. Each iteration corresponds to a successful</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// connection attempt and the subsequent handling of the connection.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	for {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if initial {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			initial = false</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		} else {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Remote &lt;- config.Message{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Username: &#34;system&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Text:     &#34;rejoin&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Channel:  &#34;&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Account:  b.Account,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Event:    config.EventRejoinChannels,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if room, ok := b.rooms[channel]; ok {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return room</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if err := b.handleXMPP(); err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Log.WithError(err).Error(&#34;Disconnected.&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.setConnected(false)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	mucJID := b.buildMucJID(channel)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	room := &amp;mucRoom{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Channel:     channel,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		MucJID:      mucJID,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		BotNick:     b.botNick,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		PuppetNicks: make(map[string]string),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.rooms[channel] = room</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return room</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		// Reconnection loop using an exponential back-off strategy. We</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		// only break out of the loop if we have successfully reconnected.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		for {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			d := bf.Duration()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Log.Infof(&#34;Reconnecting in %s.&#34;, d)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			time.Sleep(d)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) getRoomByJID(roomJID string) *mucRoom {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.mu.RLock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	defer b.mu.RUnlock()</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Log.Infof(&#34;Reconnecting now.&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if err := b.createXMPP(); err == nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.setConnected(true)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				bf.Reset()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				break</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Log.Warn(&#34;Failed to reconnect.&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	for _, room := range b.rooms {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if room.MucJID == roomJID {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			return room</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return nil</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) xmppKeepAlive() chan bool {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	done := make(chan bool)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	go func() {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		ticker := time.NewTicker(90 * time.Second)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		defer ticker.Stop()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		for {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			select {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			case &lt;-ticker.C:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.Log.Debugf(&#34;PING&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				if err := b.xc.PingC2S(&#34;&#34;, &#34;&#34;); err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					b.Log.Debugf(&#34;PING failed %#v&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			case &lt;-done:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				return</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return done</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) buildMucJID(channel string) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return channel + &#34;@&#34; + b.mucDomain</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) handleXMPP() error {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.startTime = time.Now()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) botJID() string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return b.botNick + &#34;@&#34; + b.domain</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	done := b.xmppKeepAlive()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	defer close(done)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) ensurePuppet(room *mucRoom, displayName, userID, protocol string) (string, string) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	puppetNick := displayName</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	puppetJID := b.buildPuppetJID(displayName, userID, protocol)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	for {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		m, err := b.xc.Recv()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			// An error together with AvatarData is non-fatal</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			switch m.(type) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			case xmpp.AvatarData:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				continue</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			default:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				return err</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if _, ok := room.PuppetNicks[puppetNick]; !ok {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.ensureMemberAffiliation(room.MucJID, puppetJID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if err := b.joinMuc(room.MucJID, puppetNick, puppetJID); err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			b.Log.WithError(err).Errorf(&#34;XMPP puppet join failed: room=%s nick=%s jid=%s&#34;, room.MucJID, puppetNick, puppetJID)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		room.PuppetNicks[puppetNick] = puppetJID</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		switch v := m.(type) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		case xmpp.Chat:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if v.Type == &#34;groupchat&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.Log.Debugf(&#34;== Receiving %#v&#34;, v)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				// Skip invalid messages.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				if b.skipMessage(v) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					continue</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return puppetJID, puppetNick</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				var event string</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				if strings.Contains(v.Text, &#34;has set the subject to:&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					event = config.EventTopicChange</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) buildPuppetJID(displayName, userID, protocol string) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.GetBool(&#34;UsePerProtocolJID&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		local := protocol + &#34;-&#34; + shortHash(userID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return local + &#34;@&#34; + b.domain</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	} else {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		local := shortHash(displayName)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return local + &#34;@&#34; + b.domain</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				available, sok := b.avatarAvailability[v.Remote]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				avatar := &#34;&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				if !sok {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					b.Log.Debugf(&#34;Requesting avatar data&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					b.avatarAvailability[v.Remote] = false</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					b.xc.AvatarRequestData(v.Remote)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				} else if available {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					avatar = getAvatar(b.avatarMap, v.Remote, b.General)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func shortHash(value string) string {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	sum := sha1.Sum([]byte(value))</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return hex.EncodeToString(sum[:])[:12]</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				rmsg := config.Message{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Username: b.parseNick(v.Remote),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Text:     v.Text,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Channel:  b.parseChannel(v.Remote),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Account:  b.Account,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Avatar:   avatar,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					UserID:   v.Remote,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					// Here the stanza-id has been set by the server and can be used to provide replies</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					// as explained in XEP-0461 https://xmpp.org/extensions/xep-0461.html#business-id</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					ID:    v.StanzaID.ID,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					Event: event,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) ensureMemberAffiliation(mucJID, puppetJID string) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	// horrible, but go-xmpp doesn&#39;t have muc#admin yet</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	iq := fmt.Sprintf(&#34;&lt;iq type=&#39;set&#39; from=&#39;%s&#39; to=&#39;%s&#39; id=&#39;mb-affil&#39;&gt;&lt;query xmlns=&#39;http://jabber.org/protocol/muc#admin&#39;&gt;&lt;item affiliation=&#39;member&#39; jid=&#39;%s&#39;/&gt;&lt;/query&gt;&lt;/iq&gt;&#34;, b.botJID(), mucJID, puppetJID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err := b.component.SendRaw(iq); err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.Log.WithError(err).Errorf(&#34;XMPP set affiliation failed: room=%s jid=%s&#34;, mucJID, puppetJID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				// Check if we have an action event.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				var ok bool</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				rmsg.Text, ok = b.replaceAction(rmsg.Text)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				if ok {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>					rmsg.Event = config.EventUserAction</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) joinMuc(mucJID, nick, fromJID string) error {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	pres := stanza.NewPresence(stanza.Attrs{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		To:   mucJID + &#34;/&#34; + nick,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		From: fromJID,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	})</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.Log.Debugf(&#34;&lt;= Sending message from %s on %s to gateway&#34;, rmsg.Username, b.Account)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.Log.Debugf(&#34;&lt;= Message is %#v&#34;, rmsg)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.Remote &lt;- rmsg</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		case xmpp.AvatarData:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.handleDownloadAvatar(v)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.avatarAvailability[v.From] = true</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			b.Log.Debugf(&#34;Avatar for %s is now available&#34;, v.From)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		case xmpp.Presence:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			// Do nothing.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	mucExt := stanza.MucPresence{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		History: stanza.History{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			MaxStanzas: stanza.NewNullableInt(0),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		},</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	pres.Extensions = append(pres.Extensions, mucExt)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) replaceAction(text string) (string, bool) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if strings.HasPrefix(text, &#34;/me &#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return strings.ReplaceAll(text, &#34;/me &#34;, &#34;&#34;), true</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err := b.component.Send(pres); err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.Log.WithError(err).Errorf(&#34;XMPP join presence failed: to=%s from=%s&#34;, mucJID+&#34;/&#34;+nick, fromJID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return err</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return text, false</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return nil</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// handleUploadFile handles native upload of files</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) handleUploadFile(msg *config.Message) error {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	var urlDesc string</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	for _, file := range msg.Extra[&#34;file&#34;] {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		fileInfo := file.(config.FileInfo)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if fileInfo.Comment != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			msg.Text += fileInfo.Comment + &#34;: &#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if fileInfo.URL != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			msg.Text = fileInfo.URL</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if fileInfo.Comment != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				msg.Text = fileInfo.Comment + &#34;: &#34; + fileInfo.URL</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				urlDesc = fileInfo.Comment</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if _, err := b.xc.Send(xmpp.Chat{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			Type:   &#34;groupchat&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			Remote: msg.Channel + &#34;@&#34; + b.GetString(&#34;Muc&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			Text:   msg.Username + msg.Text,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}); err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			return err</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) sendMucMessage(mucJID, fromJID, body string) error {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Debugf(&#34;XMPP send message: to=%s from=%s body_len=%d&#34;, mucJID, fromJID, len(body))</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	msg := stanza.NewMessage(stanza.Attrs{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Type: stanza.MessageTypeGroupchat,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		To:   mucJID,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		From: fromJID,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	msg.Body = body</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if fileInfo.URL != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if _, err := b.xc.SendOOB(xmpp.Chat{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Type:    &#34;groupchat&#34;,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Remote:  msg.Channel + &#34;@&#34; + b.GetString(&#34;Muc&#34;),</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Ooburl:  fileInfo.URL,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Oobdesc: urlDesc,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}); err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.Log.WithError(err).Warn(&#34;Failed to send share URL.&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err := b.component.Send(msg); err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.Log.WithError(err).Errorf(&#34;XMPP send failed: to=%s from=%s&#34;, mucJID, fromJID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return err</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return nil</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) parseNick(remote string) string {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	s := strings.Split(remote, &#34;@&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if len(s) &gt; 1 {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		s = strings.Split(s[1], &#34;/&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if len(s) == 2 {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			return s[1] // nick</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) leaveAllRooms() {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.mu.RLock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	defer b.mu.RUnlock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	for _, room := range b.rooms {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		pres := stanza.NewPresence(stanza.Attrs{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			Type: stanza.PresenceTypeUnavailable,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			To:   room.MucJID + &#34;/&#34; + room.BotNick,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			From: b.botJID(),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		_ = b.component.Send(pres)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		for nick, jid := range room.PuppetNicks {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			pres := stanza.NewPresence(stanza.Attrs{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				Type: stanza.PresenceTypeUnavailable,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				To:   room.MucJID + &#34;/&#34; + nick,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				From: jid,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			_ = b.component.Send(pres)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return &#34;&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) parseChannel(remote string) string {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	s := strings.Split(remote, &#34;@&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if len(s) &gt;= 2 {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return s[0] // channel</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return &#34;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) handleComponentError(err error) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.WithError(err).Error(&#34;XMPP component error&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	_ = b.component.Disconnect()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.setConnected(false)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.signalReconnect()</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// skipMessage skips messages that need to be skipped</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (b *Bxmpp) skipMessage(message xmpp.Chat) bool {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// skip messages from ourselves</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if b.parseNick(message.Remote) == b.GetString(&#34;Nick&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return true</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) signalReconnect() {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.reconnectCh == nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// skip empty messages</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if message.Text == &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return true</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	select {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	case b.reconnectCh &lt;- struct{}{}:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	default:</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// skip subject messages</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if strings.Contains(message.Text, &#34;&lt;/subject&gt;&#34;) {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return true</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func (b *Bxmpp) manageConnection() {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	bf := &amp;backoff.Backoff{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Min:    time.Second,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Max:    5 * time.Minute,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		Jitter: true,</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// do not show subjects on connect #732</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if strings.Contains(message.Text, &#34;has set the subject to:&#34;) &amp;&amp; time.Since(b.startTime) &lt; time.Second*5 {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return true</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	for {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		_, ok := &lt;-b.reconnectCh</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if !ok {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			return</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		for {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			d := bf.Duration()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			b.Log.Infof(&#34;Reconnecting in %s.&#34;, d)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			time.Sleep(d)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			b.Log.Infof(&#34;Reconnecting now.&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			if err := b.component.Resume(); err == nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				b.setConnected(true)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				bf.Reset()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				b.Remote &lt;- config.Message{</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>					Username: &#34;system&#34;,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>					Text:     &#34;rejoin&#34;,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>					Channel:  &#34;&#34;,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>					Account:  b.Account,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>					Event:    config.EventRejoinChannels,</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				break</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			b.Log.Warn(&#34;Failed to reconnect.&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// skip delayed messages</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return !message.Stamp.IsZero() &amp;&amp; time.Since(message.Stamp).Minutes() &gt; 5</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func parseRoomNick(from string) (string, string) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	parts := strings.Split(from, &#34;/&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if len(parts) != 2 {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return &#34;&#34;, &#34;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return parts[0], parts[1]</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bxmpp) setConnected(state bool) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.Lock()</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.connected = state</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	defer b.Unlock()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Unlock()</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bxmpp) Connected() bool {</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/gateway/gateway.go</span> <span class="git-file-b">b/gateway/gateway.go</span>
<span class="git-index">index</span> <span class="git-index-old">7ca84e4</span>..<span class="git-index-new">57014ef</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">gateway/gateway.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">gateway/gateway.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-107</span> <span class="git-hunk-new">+107</span> <span class="git-hunk">@@</span><span class="git-function-context"> import (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/d5/tengo/v2&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/d5/tengo/v2/stdlib&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	lru &#34;github.com/hashicorp/golang-lru&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;github.com/kyokomi/emoji/v2&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>//	&#34;github.com/kyokomi/emoji/v2&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/bridge&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/config&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/internal&#34;</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-4178</span> <span class="git-hunk-new">+4178</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (gw *Gateway) modifyMessage(msg *config.Message) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	// replace :emoji: to unicode</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	emoji.ReplacePadding = &#34;&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	msg.Text = emoji.Sprint(msg.Text)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>//	emoji.ReplacePadding = &#34;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>//	msg.Text = emoji.Sprint(msg.Text)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	br := gw.Bridges[msg.Account]</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	// loop to replace messages</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/go.mod</span> <span class="git-file-b">b/go.mod</span>
<span class="git-index">index</span> <span class="git-index-old">1638863</span>..<span class="git-index-new">a6f966f</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">go.mod</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">go.mod</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-387</span> <span class="git-hunk-new">+386</span> <span class="git-hunk">@@</span><span class="git-function-context"> require (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/stretchr/testify v1.11.1</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/vincent-petithory/dataurl v1.0.0</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/writeas/go-strip-markdown v2.0.1+incompatible</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	github.com/xmppo/go-xmpp v0.3.1</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/yaegashi/msgraph.go v0.1.4</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/zfjagann/golang-ring v0.0.0-20220330170733-19bcea1b6289</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	go.mau.fi/whatsmeow v0.0.0-20251116104239-3aca43070cd4</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-476</span> <span class="git-hunk-new">+467</span> <span class="git-hunk">@@</span><span class="git-function-context"> require (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	golang.org/x/text v0.32.0</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	gomod.garykim.dev/nc-talk v0.3.0</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	google.golang.org/protobuf v1.36.10</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	gosrc.io/xmpp v0.5.1</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	layeh.com/gumble v0.0.0-20221205141517-d1df60a3cc14</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	maunium.net/go/mautrix v0.26.0</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	modernc.org/sqlite v1.32.0</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-13522</span> <span class="git-hunk-new">+13529</span> <span class="git-hunk">@@</span><span class="git-function-context"> require (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	go.uber.org/multierr v1.11.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	golang.org/x/crypto v0.46.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 // indirect</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	golang.org/x/mod v0.32.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	golang.org/x/net v0.48.0 // indirect</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	golang.org/x/sync v0.19.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	golang.org/x/sys v0.39.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	golang.org/x/term v0.38.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	golang.org/x/time v0.5.0 // indirect</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	golang.org/x/tools v0.41.0 // indirect</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	google.golang.org/genproto/googleapis/rpc v0.0.0-20240722135656-d784300faade // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	google.golang.org/grpc v1.65.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	gopkg.in/ini.v1 v1.67.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	gopkg.in/yaml.v2 v2.4.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	gopkg.in/yaml.v3 v3.0.1 // indirect</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	mellium.im/reader v0.1.0 // indirect</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	mellium.im/sasl v0.3.2 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	modernc.org/libc v1.55.3 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	modernc.org/mathutil v1.6.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	modernc.org/memory v1.8.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	modernc.org/strutil v1.2.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	modernc.org/token v1.1.0 // indirect</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	nhooyr.io/websocket v1.6.5 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	rsc.io/qr v0.2.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/go.sum</span> <span class="git-file-b">b/go.sum</span>
<span class="git-index">index</span> <span class="git-index-old">090927b</span>..<span class="git-index-new">97fd014</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">go.sum</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">go.sum</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-226</span> <span class="git-hunk-new">+227</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/SevereCloud/vksdk/v2 v2.17.0 h1:Wll63JSuBTdE0L7+V/PMn9PyhLrWSWIjX76Xp</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/SevereCloud/vksdk/v2 v2.17.0/go.mod h1:y3q3XAdqnQ2Wf0B+Wi7qNdqJc5ZZsz4ve+DoSQsrChk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/agnivade/wasmbrowsertest v0.3.1/go.mod h1:zQt6ZTdl338xxRaMW395qccVE2eQm0SjC/SDz0mPWQI=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/alexcesaro/log v0.0.0-20150915221235-61e686294e58/go.mod h1:YNfsMyWSs+h+PaYkxGeMVmVCX75Zj/pqdjbu12ciCYE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-466</span> <span class="git-hunk-new">+4712</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/bwmarrin/discordgo v0.28.1 h1:gXsuo2GBO7NbR6uqmrrBDplPUx2T3nzu775q/Rd1aG4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/bwmarrin/discordgo v0.28.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/chromedp/cdproto v0.0.0-20190614062957-d6d2f92b486d/go.mod h1:S8mB5wY3vV+vRIzf39xDXsw3XKYewW9X6rW2aEmkrSw=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/chromedp/cdproto v0.0.0-20190621002710-8cbd498dd7a0/go.mod h1:S8mB5wY3vV+vRIzf39xDXsw3XKYewW9X6rW2aEmkrSw=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/chromedp/cdproto v0.0.0-20190812224334-39ef923dcb8d/go.mod h1:0YChpVzuLJC5CPr+x3xkHN6Z8KOSXjNbL7qV8Wc4GW0=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/chromedp/cdproto v0.0.0-20190926234355-1b4886c6fad6/go.mod h1:0YChpVzuLJC5CPr+x3xkHN6Z8KOSXjNbL7qV8Wc4GW0=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/chromedp/chromedp v0.3.1-0.20190619195644-fd957a4d2901/go.mod h1:mJdvfrVn594N9tfiPecUidF6W5jPRKHymqHfzbobPsM=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/chromedp/chromedp v0.4.0/go.mod h1:DC3QUn4mJ24dwjcaGQLoZrhm4X/uPHZ6spDbS2uFhm4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-638</span> <span class="git-hunk-new">+7010</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/dyatlov/go-opengraph/opengraph v0.0.0-20220524092352-606d7b1e5f8a h1:etIrTD8BQqzColk9nKRusM9um5+1q0iOEJLqfBMIK64=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/dyatlov/go-opengraph/opengraph v0.0.0-20220524092352-606d7b1e5f8a/go.mod h1:emQhSYTXqB0xxjLITTw4EaWZ+8IIQYw+kx9GqNUKdLg=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/elliotchance/orderedmap/v3 v3.1.0 h1:j4DJ5ObEmMBt/lcwIecKcoRxIQUEnw0L804lXYDt/pg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/elliotchance/orderedmap/v3 v3.1.0/go.mod h1:G+Hc2RwaZvJMcS4JpGCOyViCnGeKf0bTYCGTO4uhjSo=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-839</span> <span class="git-hunk-new">+9214</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/go-asn1-ber/asn1-ber v1.5.7 h1:DTX+lbVTWaTw1hQ+PbZPlnDZPEIs0SS/GCZAl535dDk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/go-asn1-ber/asn1-ber v1.5.7/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/go-interpreter/wagon v0.5.1-0.20190713202023-55a163980b6c/go.mod h1:5+b/MBYkclRZngKF5s6qrgWxSLgE9F5dFdO1hAueZLc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/go-interpreter/wagon v0.6.0/go.mod h1:5+b/MBYkclRZngKF5s6qrgWxSLgE9F5dFdO1hAueZLc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-9612</span> <span class="git-hunk-new">+11014</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/gomarkdown/markdown v0.0.0-20240419095408-642f0ee99ae2 h1:yEt5djSYb4iNtmV9iJGVday+i4e9u6Mrn5iP64HH5QM=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/gomarkdown/markdown v0.0.0-20240419095408-642f0ee99ae2/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1106</span> <span class="git-hunk-new">+1268</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/google/gops v0.3.27 h1:BDdWfedShsBbeatZ820oA4DbVOC8yJ4NI8xAlDFWfgI=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/gops v0.3.27/go.mod h1:lYqabmfnq4Q6UumWNx96Hjup5BDAVc8zmfIy0SkNCSk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/google/pprof v0.0.0-20190908185732-236ed259b199/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1526</span> <span class="git-hunk-new">+1707</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1626</span> <span class="git-hunk-new">+1819</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/kettek/apng v0.0.0-20191108220231-414630eed80f/go.mod h1:x78/VRQYKuCf</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/knq/sysutil v0.0.0-20181215143952-f05b59f0f307/go.mod h1:BjPj+aVjl9FW/cCGiF3nGh5v+9Gd3VCgBQbod/GlMaQ=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1846</span> <span class="git-hunk-new">+20611</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/mailru/easyjson v0.0.0-20190403194419-1ea4449da983/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/mailru/easyjson v0.0.0-20190620125010-da37f6c1e481/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696 h1:pmPKkN3RJM9wVMZidR99epzK0+gatQiqVtvP1FacZcQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696/go.mod h1:c6MxwqHD+0HvtAJjsHMIdPCiAwGiQwPRPTp69ACMg8A=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/matterbridge/gozulipbot v0.0.0-20211023205727-a19d6c1f3b75 h1:GslZKF7lW7oSisycGLpxPO+TnKJuA4VZuTWIfYZrClc=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2026</span> <span class="git-hunk-new">+2297</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/mattermost/logr/v2 v2.0.21 h1:CMHsP+nrbRlEC4g7BwOk1GAnMtHkniFhlSQPXy5</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattermost/logr/v2 v2.0.21/go.mod h1:kZkB/zqKL9e+RY5gB3vGpsyenC+TpuiOenjMkvJJbzc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattermost/mattermost/server/public v0.1.6 h1:k3upRnYfDY9CtVifQ+hQS6ZP4dGsU6I3oG1DCcBYy0c=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattermost/mattermost/server/public v0.1.6/go.mod h1:Dm5uf3z8ckDOKYD1cbnb1Uqm/G9WYIaouSP/HnH+Rbs=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2098</span> <span class="git-hunk-new">+23710</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2548</span> <span class="git-hunk-new">+28410</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DV</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/olahol/melody v1.2.1 h1:xdwRkzHxf+B0w4TKbGpUSSkV516ZucQZJIWLztOWICQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/olahol/melody v1.2.1/go.mod h1:GgkTl6Y7yWj/HtfD48Q5vLKPVoZOH+Qqgfa7CvJgJM4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2736</span> <span class="git-hunk-new">+3057</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/petermattis/goid v0.0.0-20250904145737-900bdf8bb490 h1:QTvNkZ5ylY0PGg</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/petermattis/goid v0.0.0-20250904145737-900bdf8bb490/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 h1:jYi87L8j62qkXzaYHAQAhEapgukhenIMZRBKTNRLHJ4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-3376</span> <span class="git-hunk-new">+3708</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1l</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882 h1:A7o8tOERTtpD/poS+2VoassCjXpjHn916luXbf5QKD0=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-35416</span> <span class="git-hunk-new">+38919</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-3976</span> <span class="git-hunk-new">+4357</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPf</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc/go.mod h1:NoCfSFWosfqMqmmD7hApkirIK9ozpHjxRnRxs1l413A=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-4286</span> <span class="git-hunk-new">+4677</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/zfjagann/golang-ring v0.0.0-20220330170733-19bcea1b6289 h1:dEdcEes8Aki8XrgZFyrZvtazFlW4U7eNvX9NuyFJAtQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/zfjagann/golang-ring v0.0.0-20220330170733-19bcea1b6289/go.mod h1:0MsIttMJIF/8Y7x0XjonJP7K99t3sR6bjj4m5S4JmqU=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>go.coder.com/go-tools v0.0.0-20190317003359-0c6a35b74a16/go.mod h1:iKV5yK9t+J5nG9O3uF6KYdPEz3dyfMyB15MN1rbQ8Qw=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go.mau.fi/libsignal v0.2.1 h1:vRZG4EzTn70XY6Oh/pVKrQGuMHBkAWlGRC22/85m9L0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go.mau.fi/libsignal v0.2.1/go.mod h1:iVvjrHyfQqWajOUaMEsIfo3IqgVMrhWcPiiEzk7NgoU=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go.mau.fi/util v0.9.3 h1:aqNF8KDIN8bFpFbybSk+mEBil7IHeBwlujfyTnvP0uU=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-43510</span> <span class="git-hunk-new">+47513</span> <span class="git-hunk">@@</span><span class="git-function-context"> go.mau.fi/util v0.9.3/go.mod h1:krWWfBM1jWTb5f8NCa2TLqWMQuM81X7TGQjhMjBeXmQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go.mau.fi/whatsmeow v0.0.0-20251116104239-3aca43070cd4 h1:7hXdxCFs2Me4nypiWjdBNonaFrPfmYJvEtTOwLctSHU=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go.mau.fi/whatsmeow v0.0.0-20251116104239-3aca43070cd4/go.mod h1:5aYaEa3FF5e5XWsA8Xa80ttUXZvb6HyaBGgo2SfzUkE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-45717</span> <span class="git-hunk-new">+50022</span> <span class="git-hunk">@@</span><span class="git-function-context"> golang.org/x/image v0.19.0/go.mod h1:y0zrRqlQRWQ5PXaYCOMLTW2fpsxZ8Qh9I/ohnInJEys</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-5008</span> <span class="git-hunk-new">+54814</span> <span class="git-hunk">@@</span><span class="git-function-context"> golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/sys v0.0.0-20190618155005-516e3c20635f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-5336</span> <span class="git-hunk-new">+5877</span> <span class="git-hunk">@@</span><span class="git-function-context"> golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-5406</span> <span class="git-hunk-new">+5958</span> <span class="git-hunk">@@</span><span class="git-function-context"> golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/tools v0.0.0-20200529172331-a64b76657301/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-5486</span> <span class="git-hunk-new">+6058</span> <span class="git-hunk">@@</span><span class="git-function-context"> golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gomod.garykim.dev/nc-talk v0.3.0 h1:MZxLc/gX2/+bdOw4xt6pi+qQFUQld1woGfw1hEJ0fbM=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gomod.garykim.dev/nc-talk v0.3.0/go.mod h1:q/Adot/H7iqi+H4lANopV7/xcMf+sX3AZXUXqiITwok=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-57211</span> <span class="git-hunk-new">+63114</span> <span class="git-hunk">@@</span><span class="git-function-context"> google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-5926</span> <span class="git-hunk-new">+65410</span> <span class="git-hunk">@@</span><span class="git-function-context"> gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>gosrc.io/xmpp v0.5.1 h1:Rgrm5s2rt+npGggJH3HakQxQXR8ZZz3+QRzakRQqaq4=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>gosrc.io/xmpp v0.5.1/go.mod h1:L3NFMqYOxyLz3JGmgFyWf7r9htE91zVGiK40oW4RwdY=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-6016</span> <span class="git-hunk-new">+66714</span> <span class="git-hunk">@@</span><span class="git-function-context"> layeh.com/gumble v0.0.0-20221205141517-d1df60a3cc14 h1:wY8eeq7DpM5iAugNbFrvuhdtm</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>layeh.com/gumble v0.0.0-20221205141517-d1df60a3cc14/go.mod h1:tWPVA9ZAfImNwabjcd9uDE+Mtz0Hfs7a7G3vxrnrwyc=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>maunium.net/go/mautrix v0.26.0 h1:valc2VmZF+oIY4bMq4Cd5H9cEKMRe8eP4FM7iiaYLxI=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>maunium.net/go/mautrix v0.26.0/go.mod h1:NWMv+243NX/gDrLofJ2nNXJPrG8vzoM+WUCWph85S6Q=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mellium.im/reader v0.1.0 h1:UUEMev16gdvaxxZC7fC08j7IzuDKh310nB6BlwnxTww=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mellium.im/reader v0.1.0/go.mod h1:F+X5HXpkIfJ9EE1zHQG9lM/hO946iYAmU7xjg5dsQHI=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mellium.im/sasl v0.3.2 h1:PT6Xp7ccn9XaXAnJ03FcEjmAn7kK1x7aoXV6F+Vmrl0=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mellium.im/sasl v0.3.2/go.mod h1:NKXDi1zkr+BlMHLQjY3ofYuU4KSPFxknb8mfEu6SveY=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mellium.im/xmlstream v0.15.4 h1:gLKxcWl4rLMUpKgtzrTBvr4OexPeO/edYus+uK3F6ZI=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mellium.im/xmlstream v0.15.4/go.mod h1:yXaCW2++fmVO4L9piKVkyLDqnCmictVYF7FDQW8prb4=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mellium.im/xmpp v0.22.0 h1:UthQVSwEAr7SNrmyc90c2ykGpVHxjn/3yw8Ey4+Im8s=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mellium.im/xmpp v0.22.0/go.mod h1:WSjq12nhREFD88Vy/0WD6Q8inE8t6a8w7QjzwivWitw=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y=</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-6276</span> <span class="git-hunk-new">+7019</span> <span class="git-hunk">@@</span><span class="git-function-context"> modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>mvdan.cc/sh v2.6.4+incompatible/go.mod h1:IeeQbZq+x2SUGBensq/jge5lLQbS3XT2ktyp3wrt4x8=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>nhooyr.io/websocket v1.6.5 h1:8TzpkldRfefda5JST+CnOH135bzVPz5uzfn/AF+gVKg=</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>nhooyr.io/websocket v1.6.5/go.mod h1:F259lAzPRAH0htX2y3ehpJe09ih1aSHN7udWki1defY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/matterbridge.toml.sample</span> <span class="git-file-b">b/matterbridge.toml.sample</span>
<span class="git-index">index</span> <span class="git-index-old">7653e14</span>..<span class="git-index-new">93b128a</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">matterbridge.toml.sample</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">matterbridge.toml.sample</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-9506</span> <span class="git-hunk-new">+95018</span> <span class="git-hunk">@@</span><span class="git-function-context"> SyncTopic=false</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span># Default &#34;&lt;clipped message&gt;&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>MessageClipped=&#34;&lt;clipped message&gt;&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>#Disable quoted/reply messages</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>#OPTIONAL (default false)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>QuoteDisable=false</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>#Set the max. quoted length if 0 the whole message will be quoted</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>#OPTIONAL (default 0)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>QuoteLengthLimit=0</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>#Format quoted/reply messages</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>#OPTIONAL (default &#34;{MESSAGE} (re @{QUOTENICK}: {QUOTEMESSAGE})&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>QuoteFormat=&#34;{MESSAGE} (re @{QUOTENICK}: {QUOTEMESSAGE})&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span># Before clipping, try to split messages into at most this many parts. 0 is treated like 1.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span># Be careful with large numbers, as this might cause flooding.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span># Example: A maximum telegram message of 4096 bytes is received. This requires 3 Discord</span>
</div></pre>
]]></description>
<author>
	rani
	(clagv.randomgames@gmail.com)
</author>
<pubDate>Tue, 17 Feb 2026 21:19:23 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/643f6b7f33f13f8f4f6c5c4c8583169c08f2e866</link>
<title>Build with CGO_ENABLED=1 to get sqllite driver working
</title>
<guid>643f6b7
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">643f6b7f33f13f8f4f6c5c4c8583169c08f2e866</span> <span class="git-refs"></span>
Author: root &lt;root@webserver&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Wed Jan 07 16:50:33 2026 +0000</span>

<span class="git-message-line">    Build with CGO_ENABLED=1 to get sqllite driver working</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/Dockerfile</span> <span class="git-file-b">b/Dockerfile</span>
<span class="git-index">index</span> <span class="git-index-old">67baf54</span>..<span class="git-index-new">62ea146</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">Dockerfile</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">Dockerfile</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-69</span> <span class="git-hunk-new">+69</span> <span class="git-hunk">@@</span><span class="git-function-context"> RUN go mod download</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>COPY . /go/src/matterbridge</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>RUN apk --no-cache add git</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>RUN apk --no-cache add git gcc musl-dev</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>RUN cd /go/src/matterbridge &amp;&amp; \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    CGO_ENABLED=0 go build -tags goolm -ldflags &#34;-X github.com/matterbridge-org/matterbridge/version.GitHash=$(git log --pretty=format:&#39;%h&#39; -n 1)&#34; -o /bin/matterbridge</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    CGO_ENABLED=1 go build -tags goolm -ldflags &#34;-X github.com/matterbridge-org/matterbridge/version.GitHash=$(git log --pretty=format:&#39;%h&#39; -n 1)&#34; -o /bin/matterbridge</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>FROM alpine</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>RUN apk --no-cache add ca-certificates mailcap</span>
</div></pre>
]]></description>
<author>
	root
	(root@webserver)
</author>
<pubDate>Wed, 07 Jan 2026 15:50:33 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/49125afb8c057d75b3f7bfe4811921c648fc7896</link>
<title>mediaserver: Deprecate `MediaServerUpload`
</title>
<guid>49125af
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">49125afb8c057d75b3f7bfe4811921c648fc7896</span> <span class="git-refs"></span>
Author: selfhoster1312 &lt;selfhoster1312@kl.netlib.re&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Sun Jan 04 17:21:13 2026 +0000</span>

<span class="git-message-line">    mediaserver: Deprecate `MediaServerUpload`</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/config/config.go</span> <span class="git-file-b">b/bridge/config/config.go</span>
<span class="git-index">index</span> <span class="git-index-old">7079d42</span>..<span class="git-index-new">37a99eb</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/config/config.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/config/config.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-15010</span> <span class="git-hunk-new">+1509</span> <span class="git-hunk">@@</span><span class="git-function-context"> type Protocol struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	Login                  string   // mattermost, matrix</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	LogFile                string   // general</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	MediaDownloadBlackList []string</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	MediaDownloadPath      string // Basically MediaServerUpload, but instead of uploading it, just write it to a file on the same server.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	MediaDownloadPath      string // Write upload to a file on the same server.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	MediaDownloadSize      int    // all protocols</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	MediaServerDownload    string</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	MediaServerUpload      string</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	MediaConvertTgs        string     // telegram</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	MediaConvertWebPToPNG  bool       // telegram</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	MessageDelay           int        // IRC, time in millisecond to wait between messages</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/mattermost/handlers.go</span> <span class="git-file-b">b/bridge/mattermost/handlers.go</span>
<span class="git-index">index</span> <span class="git-index-old">a4743b3</span>..<span class="git-index-new">88e4475</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/mattermost/handlers.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/mattermost/handlers.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1097</span> <span class="git-hunk-new">+1097</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmattermost) handleMatterClient(messages chan *config.Message) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		// only download avatars if we have a place to upload them (configured mediaserver)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if b.General.MediaServerUpload != &#34;&#34; || b.General.MediaDownloadPath != &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if b.General.MediaDownloadPath != &#34;&#34; {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			b.handleDownloadAvatar(message.UserID, channelName)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/telegram/handlers.go</span> <span class="git-file-b">b/bridge/telegram/handlers.go</span>
<span class="git-index">index</span> <span class="git-index-old">ea63760</span>..<span class="git-index-new">b857b56</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/telegram/handlers.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/telegram/handlers.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1477</span> <span class="git-hunk-new">+1477</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Btelegram) handleUsername(rmsg *config.Message, message *tgbotapi.Messa</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		// only download avatars if we have a place to upload them (configured mediaserver)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if b.General.MediaServerUpload != &#34;&#34; || (b.General.MediaServerDownload != &#34;&#34; &amp;&amp; b.General.MediaDownloadPath != &#34;&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if b.General.MediaServerDownload != &#34;&#34; &amp;&amp; b.General.MediaDownloadPath != &#34;&#34; {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			b.handleDownloadAvatar(message.From.ID, rmsg.Channel)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1717</span> <span class="git-hunk-new">+1717</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Btelegram) handleUsername(rmsg *config.Message, message *tgbotapi.Messa</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		// only download avatars if we have a place to upload them (configured mediaserver)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if b.General.MediaServerUpload != &#34;&#34; || (b.General.MediaServerDownload != &#34;&#34; &amp;&amp; b.General.MediaDownloadPath != &#34;&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if b.General.MediaServerDownload != &#34;&#34; &amp;&amp; b.General.MediaDownloadPath != &#34;&#34; {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			b.handleDownloadAvatar(message.SenderChat.ID, rmsg.Channel)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/changelog.md</span> <span class="git-file-b">b/changelog.md</span>
<span class="git-index">index</span> <span class="git-index-old">03a9239</span>..<span class="git-index-new">fcad7f4</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">changelog.md</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">changelog.md</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-166</span> <span class="git-hunk-new">+169</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>- xmpp: Initial replies/edits support has been removed, because it was incorrect ([#12](https://github.com/matterbridge-org/matterbridge/pull/12))</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>- xmpp: `NoTls` setting has been deprecated; to disable `StartTls` and start a plaintext connection, use `NoStartTls`</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>- Go required version is now v1.24</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- `MediaServerUpload` has been deprecated ([#30](https://github.com/matterbridge-org/matterbridge/issues/30)),</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  because we don&#39;t know how to make it work and were improving those parts of the codebase.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  If you were successfully using it, your feedback is welcome and we may reintroduce it.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>## New Features</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/docs/advanced/mediaserver.md</span> <span class="git-file-b">b/docs/advanced/mediaserver.md</span>
<span class="git-index">index</span> <span class="git-index-old">2f2bbc8</span>..<span class="git-index-new">140f8b2</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">docs/advanced/mediaserver.md</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">docs/advanced/mediaserver.md</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-246</span> <span class="git-hunk-new">+215</span> <span class="git-hunk">@@</span><span class="git-function-context"> Matterbridge is not going to implement it&#39;s own &#34;mediaserver&#34; instead we make us</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>This mediaserver will be used to upload media to services that don&#39;t have support for uploading images/video/files.   </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>At this moment this is xmpp and irc</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>There are 2 options to set this up:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>* You already have a webserver running</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   * Matterbridge runs on the same server see [local download](#use-local-download)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   * Matterbridge runs on another server. If the webserver is using caddy, see [caddy](#use-remote-upload)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>* You don&#39;t have a webserver running</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   * See [caddy](#use-remote-upload)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>&gt; [!INFO]</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>&gt; The `MediaServerUpload` option has been deprecated. If you are using it and would like to</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>&gt; help reimplement and document it, please open an issue or a pull request.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span># Use remote upload</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>## Caddy</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>In this case we&#39;re using caddy for upload/downloading media. </span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Caddy has automatic https support, so I&#39;m going to describe this for https only.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>### caddy install / configuration</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Go to https://caddyserver.com/download   </span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Enable `http.upload` as plugin</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Make sure the process you&#39;re running caddy with has read/write access to `/var/www/upload/`</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Sample Caddyfile</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>yourserver.com:443 {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   log stdout</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   root /var/www/upload/</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   browse</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   basicauth /web/upload a_user a_password</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   upload /upload {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>      to &#34;/var/www/upload/&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>   }</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>### matterbridge configuration</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>configuration needs to happen in `[general]`</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[general]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaServerUpload=&#34;https://a_user:a_password@yourserver.com/upload&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaServerDownload=&#34;https://yourserver.com/&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Running the media server requires a web server which publicly serves files</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>in a given directory, where matterbridge can write the files.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span># Use local download</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>In this case we&#39;re using matterbridge to download to a local path your webserver has read access to and matterbridge has write access to.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Matterbridge is running on this same server.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/docs/settings.md</span> <span class="git-file-b">b/docs/settings.md</span>
<span class="git-index">index</span> <span class="git-index-old">e5399ef</span>..<span class="git-index-new">67f4f48</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">docs/settings.md</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">docs/settings.md</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2099</span> <span class="git-hunk-new">+2097</span> <span class="git-hunk">@@</span><span class="git-function-context"> Example: do not upload html and htm extension</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>`MediaDownloadBlacklist=[&#34;.html$&#34;,&#34;.htm$&#34;]`</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>## MediaDownloadPath</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaDownloadPath is the filesystem path where the media file will be placed, instead of uploaded, for if Matterbridge has write access to the directory your webserver is serving. \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>It is an alternative to MediaServerUpload.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>More information https://github.com/42wim/matterbridge/wiki/Mediaserver-setup-%28advanced%29</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>MediaDownloadPath is the filesystem path where the media file will be placed, instead of uploaded, for if Matterbridge has write access to the directory your webserver is serving. [More information](https://github.com/matterbridge-org/matterbridge/blob/master/docs/advanced/mediaserver.md)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Setting: OPTIONAL, RELOADABLE, GENERAL \</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Format: string \</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2207</span> <span class="git-hunk-new">+2188</span> <span class="git-hunk">@@</span><span class="git-function-context"> Example:</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>`MediaDownloadPath=&#34;/srv/http/yourserver.com/public/download&#34;`</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>## MediaDownloadSize</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Maximum size in bytes matterbridge will download for use with (`MediaServerUpload` and `MediaDownloadPath`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Maximum size in bytes matterbridge will download for use with upload to the</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>media server or to other bridges.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Setting: OPTIONAL, RELOADABLE, GENERAL \</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Format: int \</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-24019</span> <span class="git-hunk-new">+2393</span> <span class="git-hunk">@@</span><span class="git-function-context"> Format: string \</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Example: </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>`MediaServerDownload=&#34;https://youserver.com/download&#34;`</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>## MediaServerUpload </span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Used for uploading images/files/video to a remote &#34;mediaserver&#34; (a webserver like caddy for example). \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>When configured images/files uploaded on bridges like mattermost, slack, telegram will be</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>downloaded and uploaded again to MediaServerUpload URL.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>More information https://github.com/42wim/matterbridge/wiki/Mediaserver-setup-%28advanced%29</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Setting: OPTIONAL, RELOADABLE, GENERAL \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Format: string \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Example: </span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>`MediaServerUpload=&#34;https://user:pass@yourserver.com/upload&#34;`</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>## RemoteNickFormat </span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>See [RemoteNickFormat](#RemoteNickFormat)</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/gateway/handlers.go</span> <span class="git-file-b">b/gateway/handlers.go</span>
<span class="git-index">index</span> <span class="git-index-old">a151d58</span>..<span class="git-index-new">b934f53</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">gateway/handlers.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">gateway/handlers.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-115</span> <span class="git-hunk-new">+112</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>package gateway</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>import (</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;bytes&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;crypto/sha1&#34; //nolint:gosec</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;fmt&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;net/http&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;os&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;path/filepath&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;regexp&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;strings&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	&#34;time&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/bridge&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/config&#34;</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-719</span> <span class="git-hunk-new">+687</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (gw *Gateway) handleFiles(msg *config.Message) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	reg := regexp.MustCompile(&#34;[^a-zA-Z0-9]+&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	// If we don&#39;t have a attachfield or we don&#39;t have a mediaserver configured return</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if msg.Extra == nil ||</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		(gw.BridgeValues().General.MediaServerUpload == &#34;&#34; &amp;&amp;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			gw.BridgeValues().General.MediaDownloadPath == &#34;&#34;) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if msg.Extra == nil || gw.BridgeValues().General.MediaDownloadPath == &#34;&#34; {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-9118</span> <span class="git-hunk-new">+8611</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (gw *Gateway) handleFiles(msg *config.Message) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		sha1sum := fmt.Sprintf(&#34;%x&#34;, sha1.Sum(*fi.Data))[:8] //nolint:gosec</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if gw.BridgeValues().General.MediaServerUpload != &#34;&#34; {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			// Use MediaServerUpload. Upload using a PUT HTTP request and basicauth.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if err := gw.handleFilesUpload(&amp;fi); err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				gw.logger.Error(err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				continue</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		} else {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			// Use MediaServerPath. Place the file on the current filesystem.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if err := gw.handleFilesLocal(&amp;fi); err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				gw.logger.Error(err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				continue</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		// Use MediaServerPath. Place the file on the current filesystem.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		err := gw.handleFilesLocal(&amp;fi)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			gw.logger.Error(err)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			continue</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		// Download URL.</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-11831</span> <span class="git-hunk-new">+1066</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (gw *Gateway) handleFiles(msg *config.Message) {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// handleFilesUpload uses MediaServerUpload configuration to upload the file.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// Returns error on failure.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func (gw *Gateway) handleFilesUpload(fi *config.FileInfo) error {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	client := &amp;http.Client{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Timeout: time.Second * 5,</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// Use MediaServerUpload. Upload using a PUT HTTP request and basicauth.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	sha1sum := fmt.Sprintf(&#34;%x&#34;, sha1.Sum(*fi.Data))[:8] //nolint:gosec</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	url := gw.BridgeValues().General.MediaServerUpload + &#34;/&#34; + sha1sum + &#34;/&#34; + fi.Name</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	req, err := http.NewRequest(&#34;PUT&#34;, url, bytes.NewReader(*fi.Data))</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return fmt.Errorf(&#34;mediaserver upload failed, could not create request: %#v&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	gw.logger.Debugf(&#34;mediaserver upload url: %s&#34;, url)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	req.Header.Set(&#34;Content-Type&#34;, &#34;binary/octet-stream&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	_, err = client.Do(req)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return fmt.Errorf(&#34;mediaserver upload failed, could not Do request: %#v&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return nil</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// handleFilesLocal use MediaServerPath configuration, places the file on the current filesystem.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// Returns error on failure.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (gw *Gateway) handleFilesLocal(fi *config.FileInfo) error {</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/gateway/router.go</span> <span class="git-file-b">b/gateway/router.go</span>
<span class="git-index">index</span> <span class="git-index-old">f129c1b</span>..<span class="git-index-new">a8aad1a</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">gateway/router.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">gateway/router.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-586</span> <span class="git-hunk-new">+5812</span> <span class="git-hunk">@@</span><span class="git-function-context"> func NewRouter(rootLogger *logrus.Logger, cfg config.Config, bridgeMap map[strin</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// Start will connect all gateways belonging to this router and subsequently route messages</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// between them.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (r *Router) Start() error {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	// Deprecating MediaServerUpload. Remove in future v2.1 release</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	deprecatedValue, _ := r.GetString(&#34;MediaServerUpload&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if deprecatedValue != &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		r.logger.Fatal(&#34;MediaServerUpload config option has been deprecated. You should either remove this option from your configuration, or help us document it.&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	m := make(map[string]*bridge.Bridge)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	if len(r.Gateways) == 0 {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		return fmt.Errorf(&#34;no [[gateway]] configured. See https://github.com/42wim/matterbridge/wiki/How-to-create-your-config for more info&#34;)</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/matterbridge.toml.sample</span> <span class="git-file-b">b/matterbridge.toml.sample</span>
<span class="git-index">index</span> <span class="git-index-old">1030436</span>..<span class="git-index-new">7653e14</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">matterbridge.toml.sample</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">matterbridge.toml.sample</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-162820</span> <span class="git-hunk-new">+162813</span> <span class="git-hunk">@@</span><span class="git-function-context"> RemoteNickFormat=&#34;[{PROTOCOL}] &lt;{NICK}&gt; &#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>StripNick=false</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#MediaServerUpload (or MediaDownloadPath) and MediaServerDownload are used for uploading</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#images/files/video to a remote &#34;mediaserver&#34; (a webserver like caddy for example).</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#When configured images/files uploaded on bridges like mattermost, slack, telegram will be</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#downloaded and uploaded again to MediaServerUpload URL</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#MediaDownloadPath is the filesystem path where the media file will be placed, instead of uploaded,</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#for if Matterbridge has write access to the directory your webserver is serving.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#It is an alternative to MediaServerUpload.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#The MediaServerDownload will be used so that bridges without native uploading support:</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#irc and xmpp will be shown links to the files on MediaServerDownload</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#More information https://github.com/42wim/matterbridge/wiki/Mediaserver-setup-%28advanced%29</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#OPTIONAL (default empty)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaServerUpload=&#34;https://user:pass@yourserver.com/upload&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#OPTIONAL (default empty)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>MediaDownloadPath=&#34;/srv/http/yourserver.com/public/download&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#OPTIONAL (default empty)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>MediaServerDownload=&#34;https://youserver.com/download&#34;</span>
</div></pre>
]]></description>
<author>
	selfhoster1312
	(selfhoster1312@kl.netlib.re)
</author>
<pubDate>Sun, 04 Jan 2026 16:21:13 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/5a1e2dd0928be78d059b26a1634c096fd9569313</link>
<title>matrix: use syncer.OnSync(b.mc.DontProcessOldEvents) to filter out historical messages

instead of a custom AccountDataStore

Signed-off-by: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
</title>
<guid>5a1e2dd
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">5a1e2dd0928be78d059b26a1634c096fd9569313</span> <span class="git-refs"></span>
Author: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Sun Dec 28 12:33:26 2025 +0000</span>

<span class="git-message-line">    matrix: use syncer.OnSync(b.mc.DontProcessOldEvents) to filter out historical messages</span>
<span class="git-message-line">    </span>
<span class="git-message-line">    instead of a custom AccountDataStore</span>
<span class="git-message-line">    </span>
<span class="git-message-line">    Signed-off-by: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/matrix/matrix.go</span> <span class="git-file-b">b/bridge/matrix/matrix.go</span>
<span class="git-index">index</span> <span class="git-index-old">508c98c</span>..<span class="git-index-new">873fcbd</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/matrix/matrix.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/matrix/matrix.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-14935</span> <span class="git-hunk-new">+1496</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) Connect() error {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.Log.Infof(&#34;Token: %s&#34;, b.mc.AccessToken)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.Log.Infof(&#34;Device ID: %s&#34;, b.mc.DeviceID)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	accountStore := mautrix.NewAccountDataStore(&#34;org.example.mybot.synctoken&#34;, b.mc)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.mc.Store = accountStore</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	initialFilter := mautrix.Filter{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		Room: &amp;mautrix.RoomFilter{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			Timeline: &amp;mautrix.FilterPart{</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				Limit: 0, // Request zero history messages</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			},</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		},</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// Upload the filter using client.CreateFilter()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	filterResponse, err := b.mc.CreateFilter(context.TODO(), &amp;initialFilter)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Fatalf(&#34;Failed to create filter: %v&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	filterID := filterResponse.FilterID</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	err = b.mc.Store.SaveFilterID(context.Background(), b.UserID, filterID)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Fatalf(&#34;Failed to save filter ID to store: %v&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	err = b.mc.Store.SaveNextBatch(context.TODO(), b.UserID, &#34;&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.Log.Fatalf(&#34;Failed to save initial sync token: %v&#34;, err)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	go b.handlematrix()</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return nil</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-4916</span> <span class="git-hunk-new">+4629</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) handlematrix() {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	readyChan := make(chan bool)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	var once sync.Once</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	// Drop historical messages so they don&#39;t get forwarded to other bridges</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	syncer.OnSync(b.mc.DontProcessOldEvents)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	// Drop unencrypted room connection so we can reconnect encrypted if we are using encryption</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	syncer.OnSync(func(ctx context.Context, resp *mautrix.RespSync, since string) bool {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		once.Do(func() {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			if ch != nil &amp;&amp; b.GetString(&#34;RecoveryKey&#34;) != &#34;&#34; {</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-50811</span> <span class="git-hunk-new">+48210</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) handlematrix() {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			if b == nil {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>				return</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			// Call SyncWithContext() with *only* the context.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			// It will use the FilterID and empty NextBatch token saved in the store.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			syncErr := b.mc.SyncWithContext(context.TODO())</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			if syncErr != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>				b.Log.Debugf(&#34;Sync() returned %v, retrying in 5 seconds...\n&#34;, syncErr)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			err2 := b.mc.Sync()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			if err2 != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				b.Log.Debugf(&#34;Sync() returned %v, retrying in 5 seconds...\n&#34;, err2)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>				time.Sleep(time.Second * 5)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>				continue</span>
</div></pre>
]]></description>
<author>
	Joseph Crowell
	(joseph.w.crowell@gmail.com)
</author>
<pubDate>Sun, 28 Dec 2025 02:33:26 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/e6ce7ba538264c607e64f8c7835019d13ec2f928</link>
<title>add note about fixing encryption if bot was in a room before encryption was enabled on that room

Signed-off-by: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
</title>
<guid>e6ce7ba
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">e6ce7ba538264c607e64f8c7835019d13ec2f928</span> <span class="git-refs"></span>
Author: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Wed Dec 24 23:38:29 2025 +0000</span>

<span class="git-message-line">    add note about fixing encryption if bot was in a room before encryption was enabled on that room</span>
<span class="git-message-line">    </span>
<span class="git-message-line">    Signed-off-by: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/docs/protocols/matrix/README.md</span> <span class="git-file-b">b/docs/protocols/matrix/README.md</span>
<span class="git-index">index</span> <span class="git-index-old">966793c</span>..<span class="git-index-new">8e08ab1</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">docs/protocols/matrix/README.md</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">docs/protocols/matrix/README.md</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-664</span> <span class="git-hunk-new">+6610</span> <span class="git-hunk">@@</span><span class="git-function-context"> MxID, Token and DeviceID are required for encryption even though they are option</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>5. Restart the bot and enjoy encrypted messaging</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Note: If you enable encryption on a channel after enabling encryption on the bot, you may need to regenerate your RecoveryKey, Token and DeviceID before the bot can send encrypted messages</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>##### Notes</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- If you enable encryption on a channel after enabling encryption on the bot, you may need to regenerate your RecoveryKey, Token and DeviceID before the bot can send encrypted messages</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- If Matterbridge was present before encryption was enabled on a channel, it will not initialize crypto correctly and will continue sending unencrypted messages.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  1. Kick the bot from the room or leave the room with the bot&#39;s account (e.g in Element or some other client).</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  2. Re-invite the bot to the room.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  3. The bot will get the encryption flag and start sending encrypted messages.</span>
</div></pre>
]]></description>
<author>
	Joseph Crowell
	(joseph.w.crowell@gmail.com)
</author>
<pubDate>Wed, 24 Dec 2025 13:38:29 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/7162269b91daa0f5c82e58d2a84a31abdb8d84e7</link>
<title>matrix: add e2ee support
</title>
<guid>7162269
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">7162269b91daa0f5c82e58d2a84a31abdb8d84e7</span> <span class="git-refs"></span>
Author: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue Dec 23 22:27:44 2025 +0000</span>

<span class="git-message-line">    matrix: add e2ee support</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/.gitignore</span> <span class="git-file-b">b/.gitignore</span>
<span class="git-index">index</span> <span class="git-index-old">1c9d9f9</span>..<span class="git-index-new">d7006a9</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">.gitignore</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">.gitignore</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-46</span> <span class="git-hunk-new">+47</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span># Exclude configuration file</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>matterbridge.toml</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>*.db*</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span># Exclude IDE Files</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>.vscode</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/config/config.go</span> <span class="git-file-b">b/bridge/config/config.go</span>
<span class="git-index">index</span> <span class="git-index-old">0ee0651</span>..<span class="git-index-new">7079d42</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/config/config.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/config/config.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1356</span> <span class="git-hunk-new">+1357</span> <span class="git-hunk">@@</span><span class="git-function-context"> type Protocol struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	ColorNicks             bool     // only irc for now</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	Debug                  bool     // general</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	DebugLevel             int      // only for irc now</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	DeviceID               string   // matrix</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	DisableWebPagePreview  bool     // telegram</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	EditSuffix             string   // mattermost, slack, discord, telegram</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	EditDisable            bool     // mattermost, slack, discord, telegram</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1746</span> <span class="git-hunk-new">+1757</span> <span class="git-hunk">@@</span><span class="git-function-context"> type Protocol struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	NoSendJoinPart         bool       // all protocols</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	NoTLS                  bool       // mattermost, xmpp</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	Password               string     // IRC,mattermost,XMPP,matrix</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	PickleKey              string     // matrix</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	PrefixMessagesWithNick bool       // mattemost, slack</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	PreserveThreading      bool       // slack</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	Protocol               string     // all protocols</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1816</span> <span class="git-hunk-new">+1837</span> <span class="git-hunk">@@</span><span class="git-function-context"> type Protocol struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	QuoteFormat            string     // telegram</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	QuoteLengthLimit       int        // telegram</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	RealName               string     // IRC</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	RecoveryKey            string     // matrix</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	RejoinDelay            int        // IRC</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	ReplaceMessages        [][]string // all protocols</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	ReplaceNicks           [][]string // all protocols</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/matrix/helpers.go</span> <span class="git-file-b">b/bridge/matrix/helpers.go</span>
<span class="git-index">index</span> <span class="git-index-old">f61a46a</span>..<span class="git-index-new">caa17fb</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/matrix/helpers.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/matrix/helpers.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-96</span> <span class="git-hunk-new">+99</span> <span class="git-hunk">@@</span><span class="git-function-context"> import (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;time&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	mautrix &#34;maunium.net/go/mautrix&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	/* trunk-ignore(golangci-lint2/typecheck) */</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;maunium.net/go/mautrix/crypto&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;maunium.net/go/mautrix/crypto/cryptohelper&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;maunium.net/go/mautrix/event&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;maunium.net/go/mautrix/id&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>)</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-4217</span> <span class="git-hunk-new">+456</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) getRoomID(channel string) id.RoomID {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return &#34;&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// interface2Struct marshals and immediately unmarshals an interface.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>// Useful for converting map[string]interface{} to a struct.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>func interface2Struct(in interface{}, out interface{}) error {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	jsonObj, err := json.Marshal(in)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if err != nil {</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		return err //nolint:wrapcheck</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	return json.Unmarshal(jsonObj, out)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>// getDisplayName retrieves the displayName for mxid, querying the homeserver if the mxid is not in the cache.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bmatrix) getDisplayName(ctx context.Context, mxid id.UserID) string {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	// Localpart is the user name. Return it if UseUserName is set.</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-2123</span> <span class="git-hunk-new">+20451</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) retry(f func() error) error {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// Use this function to set up your client for E2EE</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func setupEncryptedClientHelper(client *mautrix.Client, pickleKey []byte, sessionFile string) (*cryptohelper.CryptoHelper, error) {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	// The cryptohelper manages the creation of the correct CryptoStore and StateStore implementations.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	ch, err := cryptohelper.NewCryptoHelper(client, pickleKey, sessionFile)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		// This usually catches errors with opening the database file or key issues.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return nil, fmt.Errorf(&#34;failed to create crypto helper: %w&#34;, err)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	// Init MUST be called to load data from the database and prepare the internal machine.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	err = ch.Init(context.Background())</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return nil, fmt.Errorf(&#34;failed to initialize crypto helper: %w&#34;, err)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	// Hook the helper into the client</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	client.Crypto = ch</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return ch, nil</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>// Verifies your recovery key with Matrix so you can message unimpeded</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>func verifyWithRecoveryKey(ctx context.Context, machine *crypto.OlmMachine, recoveryKey string) error {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	keyId, keyData, err := machine.SSSS.GetDefaultKeyData(ctx)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	key, err := keyData.VerifyRecoveryKey(keyId, recoveryKey)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	err = machine.FetchCrossSigningKeysFromSSSS(ctx, key)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	err = machine.SignOwnDevice(ctx, machine.OwnIdentity())</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	err = machine.SignOwnMasterKey(ctx)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	return err</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>}</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/bridge/matrix/matrix.go</span> <span class="git-file-b">b/bridge/matrix/matrix.go</span>
<span class="git-index">index</span> <span class="git-index-old">cfa7b29</span>..<span class="git-index-new">508c98c</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">bridge/matrix/matrix.go</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">bridge/matrix/matrix.go</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-256</span> <span class="git-hunk-new">+257</span> <span class="git-hunk">@@</span><span class="git-function-context"> import (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;github.com/matterbridge-org/matterbridge/bridge/helper&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	mautrix &#34;maunium.net/go/mautrix&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&#34;maunium.net/go/mautrix/crypto/cryptohelper&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;maunium.net/go/mautrix/event&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	&#34;maunium.net/go/mautrix/id&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>)</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-427</span> <span class="git-hunk-new">+436</span> <span class="git-hunk">@@</span><span class="git-function-context"> type NicknameCacheEntry struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>type Bmatrix struct {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	mc          *mautrix.Client</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	UserID      id.UserID</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	AccessToken string</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	NicknameMap map[string]NicknameCacheEntry</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	RoomMap     map[id.RoomID]string</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	rateMutex   sync.RWMutex</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1198</span> <span class="git-hunk-new">+1199</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) Connect() error {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		b.UserID = userID</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.AccessToken = b.GetString(&#34;Token&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		b.Log.Info(&#34;Using existing Matrix credentials&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.mc.DeviceID = id.DeviceID(b.GetString(&#34;DeviceID&#34;))</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	} else {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		b.mc, err = mautrix.NewClient(b.GetString(&#34;Server&#34;), &#34;&#34;, &#34;&#34;)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		if err != nil {</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-14017</span> <span class="git-hunk-new">+14117</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) Connect() error {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			return err2</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		b.UserID = resp.UserID</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		b.AccessToken = resp.AccessToken</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	/**</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// BEGIN CACHED MESSAGES FIX</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	**/</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Info(&#34;Connection succeeded&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Infof(&#34;MxID: %s&#34;, b.mc.UserID)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Infof(&#34;Token: %s&#34;, b.mc.AccessToken)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Infof(&#34;Device ID: %s&#34;, b.mc.DeviceID)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	accountStore := mautrix.NewAccountDataStore(&#34;org.example.mybot.synctoken&#34;, b.mc)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	b.mc.Store = accountStore</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	b.Log.Info(&#34;Connection succeeded&#34;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	initialFilter := mautrix.Filter{</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		Room: &amp;mautrix.RoomFilter{</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			Timeline: &amp;mautrix.FilterPart{</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1769</span> <span class="git-hunk-new">+1776</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) Connect() error {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	if err != nil {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		b.Log.Fatalf(&#34;Failed to save initial sync token: %v&#34;, err)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	/**</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	// END CACHED MESSAGES FIX</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	**/</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	go b.handlematrix()</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	return nil</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-4707</span> <span class="git-hunk-new">+46838</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) NewHttpRequest(method, uri string, body io.Reader) (*http.Requ</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bmatrix) handlematrix() {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	var (</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		ch  *cryptohelper.CryptoHelper = nil</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		err error</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if b.GetString(&#34;SessionFile&#34;) != &#34;&#34; &amp;&amp;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.GetString(&#34;PickleKey&#34;) != &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		// Use a robust key generation method in production (e.g. from environment variable or key management service)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		pickleKey := []byte(b.GetString(&#34;PickleKey&#34;))</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		ch, err = setupEncryptedClientHelper(b.mc, pickleKey, b.GetString(&#34;SessionFile&#34;))</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			b.Log.Error(err)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		} else {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			b.Log.Info(&#34;Encryption subsystem configured and attached.&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	syncer := b.mc.Syncer.(*mautrix.DefaultSyncer) //nolint:forcetypeassert // We&#39;re only using DefaultSyncer</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	readyChan := make(chan bool)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	var once sync.Once</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	syncer.OnSync(func(ctx context.Context, resp *mautrix.RespSync, since string) bool {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		once.Do(func() {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			if ch != nil &amp;&amp; b.GetString(&#34;RecoveryKey&#34;) != &#34;&#34; {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>				close(readyChan)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>			}</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		return true</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	})</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	syncer.OnEventType(event.EventRedaction, b.handleRedactionEvent)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	syncer.OnEventType(event.EventMessage, b.handleMessageEvent)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	syncer.OnEventType(event.StateMember, b.handleMemberChange)</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-4906</span> <span class="git-hunk-new">+51917</span> <span class="git-hunk">@@</span><span class="git-function-context"> func (b *Bmatrix) handlematrix() {</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>			}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>		}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	}()</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Debug(&#34;Waiting for sync to receive first event from an encrypted room...&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	&lt;-readyChan</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	b.Log.Debug(&#34;First sync received&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	err = verifyWithRecoveryKey(context.Background(), ch.Machine(), b.GetString(&#34;RecoveryKey&#34;))</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	if err != nil {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		panic(err)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	} else {</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>		b.Log.Info(&#34;Verify with recovery key succeeded&#34;)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>}</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>func (b *Bmatrix) handleEdit(ev *event.Event, rmsg config.Message) bool {</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/docs/protocols/matrix/README.md</span> <span class="git-file-b">b/docs/protocols/matrix/README.md</span>
<span class="git-index">index</span> <span class="git-index-old">ccc8175</span>..<span class="git-index-new">966793c</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">docs/protocols/matrix/README.md</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">docs/protocols/matrix/README.md</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-20136</span> <span class="git-hunk-new">+2050</span> <span class="git-hunk">@@</span><span class="git-function-context"> RemoteNickFormat=&#34;[{PROTOCOL}] &lt;{NICK}&gt; &#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Server=&#34;https://matrix.org&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Login=&#34;yourlogin&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Password=&#34;yourpass&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span># Alternatively, you can use MXID + a session Token</span>
<span class="git-line-added"><span class="git-diff-plus">+</span># Alternatively, you can use MXID + a session Token + a device id</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#MxID=&#34;@yourbot:example.net&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>#Token=&#34;tokenforthebotuser&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>#DeviceID=&#34;deviceidofmxidandtokenlogin&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>```</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>## FAQ</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>### How to encrypt matterbridge messages to Matrix?</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Matterbridge doesn&#39;t properly encrypt its messages. So although matterbridge *does* work with matrix, even with matrix&#39; unencrypted rooms, the messages sent by matterbridge will all show a warning symbol to everyone, something about &#34;WARNING: This message was sent unencrypted!&#34;, which might irritate users.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>So there is a need for something that sits in the middle, pretends to be a matrix server (so that matterbridge can talk to it), and can forward everything to the real matrix server (so that the messages actually arrive), and also magically transparently &#34;encrypts&#34; everything (so that the messages show no &#34;unencrypted&#34; warning). This is exactly what pantalaimon does. Keep in mind that this effectively means you do a MITM-attack on yourself, so the connection between matterbridge and pantalaimon is *basically plaintext* and very vulnerable. You really should run matterbridge and pantalaimon on the same machine, and make sure that pantalaimon is only accessible to yourself. (I don&#39;t know if VPS is a problem here, so if you are running on a VPS then think twice before you do this setup.)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#### bridge.toml</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```toml</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[general]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaDownloadPath=&#34;/path/to/http/server/&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaServerDownload=&#34;https://foo.bar.org/server/&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaDownloadSize=10000000</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[telegram.mytelegram]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Token=&#34;1234567890:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>RemoteNickFormat=&#34;{NICK}@{PROTOCOL}: &#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaConvertWebPToPNG=true</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>MediaConvertTgs=&#34;png&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#QuoteFormat=&#34;{MESSAGE} (re @{QUOTENICK}: {QUOTEMESSAGE})&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>UseFirstName=true</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[matrix.mymatrix]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span># Server=&#34;https://matrix.org&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span># Matterbridge does not support encrypted group chats.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span># Therefore, use Pantalaimon to MiTM myself:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Server=&#34;http://localhost:20662&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span># Dedicated user</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span># Messages sent from this user will not be relayed to avoid loops.</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Login=&#34;mybot&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Password=&#34;abcdefghijklmnopqrstuvwxyz&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>RemoteNickFormat=&#34;{NICK}@{PROTOCOL}: &#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#Whether to send the homeserver suffix. eg &#34;:matrix.org&#34; in @username:matrix.org</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#to other bridges, or only send &#34;username&#34;.(true only sends username)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>NoHomeServerSuffix=true</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>HTMLDisable=true</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[[gateway]]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>name=&#34;foobar&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>enable=true</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[[gateway.inout]]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>account=&#34;telegram.mytelegram&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>channel=&#34;-1234567890123&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[[gateway.inout]]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>account=&#34;matrix.mymatrix&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>channel=&#34;!abcdefghijklmnopqr:matrix.org&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#### pantalaimon.conf</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```ini</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[Default]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>LogLevel = Debug</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>SSL = True</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>[local-matrix]</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Homeserver = https://matrix.org</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>ListenAddress = localhost</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>ListenPort = 20662</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>SSL = False</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>IgnoreVerification = True</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>UseKeyring = False</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#### run_pantalaimon.sh</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>In theory, it suffices to just call `dbus-run-session -- pantalaimon --config pantalaimon.conf`</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>However, I want *all* the logs, so I run this:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```sh</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>dbus-run-session -- pantalaimon --log-level debug --config pantalaimon.conf 2&gt;&amp;1 | \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    ./tee_unless_regex.py &#39;INFO: pantalaimon: Trying to decrypt sync|INFO: pantalaimon: Decrypting sync&#39; \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    2&gt; pantalaimon_$(date +%s).log</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>[matrix.test]</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>RemoteNickFormat=&#34;{NICK} ({LABEL}) &#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Server=&#34;&lt;https://domain.tld&gt;&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Login=&#34;yourlogin&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Password=&#34;yourpass&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>SessionFile=&#34;matrix_crypto.db&#34; # sqlite database file used to store the login session persistently</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>PickleKey=&#34;yourreallylongandcomplicatedpickle&#34; # a long password to use when accessing the session store</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>RecoveryKey=&#34;this thing isss real long bubb&#34; # your account recovery key from matrix for this account</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>MxID=&#34;@yourusername:domain.tld&#34; # your mxid from the logs</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Token=&#34;your token from log output&#34; # your token from the logs</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>DeviceID=&#34;yourdeviceid&#34; # your deviceid from the logs</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#### tee_unless_regex.py</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>#### Steps for getting an encrypted connection working</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#!/usr/bin/env python3</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>import re</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>import sys</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>def run_regex(regex):</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	while True:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		try:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			line = sys.stdin.readline()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		except KeyboardInterrupt:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			# Ctrl-C</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			return</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if not line:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			# EOF</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			return</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		line = line.rstrip(&#39;\n&#39;)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		print(line)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		if not regex.search(line):</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			print(line, file=sys.stderr)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>			sys.stderr.flush()  # This flush() is the entire reason why I don&#39;t just use &#39;grep -v&#39;. Somehow, unbuffer+grep just doesn&#39;t work. But why!?</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>def run():</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	if len(sys.argv) != 2:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		print(&#39;USAGE: {} &lt;SOME_REGEX&gt;&#39;.format(argv[0]))</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>		exit(1)</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	run_regex(re.compile(sys.argv[1]))</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>if __name__ == &#39;__main__&#39;:</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	run()</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>```</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>MxID, Token and DeviceID are required for encryption even though they are optional normally</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#### Setup</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>1. Generate a recovery key using your preferred Matrix client for your account and make sure to store it for later</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>2. Fill in the following</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>There are setup-steps missing. In particular, you absolutely need pactl at some point. TODO: Please fill in these details.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - RemoteNickFormat (Optional)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - Server</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - Login</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - Password</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - SessionFile (make sure this is readable and writable by the bot&#39;s run account)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - PickleKey</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - RecoveryKey</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>#### Invocation</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>3. Start your bot and log in making sure to keep a log or watch output</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>4. Copy these from the logs in to your configuration file</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>In one screen: `./run_pantalaimon.sh`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - MxID</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - Token</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>   - DeviceID</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>In another screen: `./matterbridge-THEVERSION-linux-arm -conf bridge.toml -debug | tee bridge_$(date +%s).log`</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>5. Restart the bot and enjoy encrypted messaging</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>(Again, the `-debug | …` stuff isn&#39;t necessary, but I personally want permanent logs of everything, just so I can trace back if something ever goes wrong. And I suggest that you do that, too.)</span>
\ No newline at end of file
<span class="git-line-added"><span class="git-diff-plus">+</span>Note: If you enable encryption on a channel after enabling encryption on the bot, you may need to regenerate your RecoveryKey, Token and DeviceID before the bot can send encrypted messages</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/docs/protocols/matrix/settings.md</span> <span class="git-file-b">b/docs/protocols/matrix/settings.md</span>
<span class="git-index">index</span> <span class="git-index-old">ed47111</span>..<span class="git-index-new">9c27372</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">docs/protocols/matrix/settings.md</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">docs/protocols/matrix/settings.md</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-36</span> <span class="git-hunk-new">+319</span> <span class="git-hunk">@@</span><span class="git-function-context"> </span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>&gt; [!TIP]</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>&gt; This page contains the details about matrix settings. More general information about matrix support in matterbridge can be found in [README.md](README.md).</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>## DeviceID</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>The device id use when logging in with MxID.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Unless this option is set, the Matrix client is unencrypted and MxID based login won&#39;t work.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Setting: **OPTIONAL**</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Format: *string*</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Example:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```toml</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  DeviceID=&#34;yourdeviceid&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>## HTMLDisable</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Whether to disable sending of HTML content to matrix</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-286</span> <span class="git-hunk-new">+4119</span> <span class="git-hunk">@@</span><span class="git-function-context"> Messages sent from this user will not be relayed to avoid loops.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  Login=&#34;yourlogin&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  ```</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>## MxID</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>MxID of your bot.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Use a dedicated user for this and not your own!</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Messages sent from this user will not be relayed to avoid loops.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Setting: **REQUIRED**</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Format: *string*</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Example:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```toml</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  MxID=&#34;@yourbot:example.net&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>## NoHomeServerSuffix</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Whether to send the homeserver suffix. eg &#34;:matrix.org&#34; in @username:matrix.org</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-516</span> <span class="git-hunk-new">+7732</span> <span class="git-hunk">@@</span><span class="git-function-context"> password of your bot.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  Password=&#34;yourpass&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  ```</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>## PickleKey</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>The key to use when accessing E2EE encryption in an encryption database.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Unless this option is set, the Matrix client is unencrypted.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Setting: **OPTIONAL**</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Format: *string*</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Example:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```toml</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  Password=&#34;yourpicklekey&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>## RecoveryKey</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>The key to use when accessing E2EE encryption in an encryption database.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Unless this option is set, the Matrix client won&#39;t be verified for encryption.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Setting: **OPTIONAL**</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Format: *string*</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Example:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```toml</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  RecoveryKey=&#34;yourrecoverykey&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>## Server</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Server is your homeserver (eg https://matrix.org)</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-626</span> <span class="git-hunk-new">+11419</span> <span class="git-hunk">@@</span><span class="git-function-context"> Server is your homeserver (eg https://matrix.org)</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  Server=&#34;https://matrix.org&#34;</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  ```</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>## SessionFile</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>The database file to use when accessing E2EE encryption in an encryption database.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Unless this option is set, the Matrix client is unencrypted.</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Setting: **OPTIONAL**</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Format: *string*</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>- Example:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```toml</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  SessionFile=&#34;yourdatabasefile.db&#34;</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  ```</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>## UseUserName</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Shows the username instead of the displayname</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/go.mod</span> <span class="git-file-b">b/go.mod</span>
<span class="git-index">index</span> <span class="git-index-old">b044a1a</span>..<span class="git-index-new">1638863</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">go.mod</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">go.mod</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-896</span> <span class="git-hunk-new">+897</span> <span class="git-hunk">@@</span><span class="git-function-context"> require (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/mattn/go-colorable v0.1.14 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/mattn/go-isatty v0.0.20 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/mattn/go-runewidth v0.0.15 // indirect</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>	github.com/mattn/go-sqlite3 v1.14.32 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/mitchellh/go-testing-interface v1.14.1 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/monaco-io/request v1.0.5 // indirect</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-1117</span> <span class="git-hunk-new">+1126</span> <span class="git-hunk">@@</span><span class="git-function-context"> require (</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/sagikazarmark/slog-shim v0.1.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/shazow/rateio v0.0.0-20200113175441-4461efc8bdc4 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882 // indirect</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/sourcegraph/conc v0.3.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/spf13/afero v1.11.0 // indirect</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>	github.com/spf13/cast v1.6.0 // indirect</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/go.sum</span> <span class="git-file-b">b/go.sum</span>
<span class="git-index">index</span> <span class="git-index-old">115140d</span>..<span class="git-index-new">090927b</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">go.sum</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">go.sum</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-3418</span> <span class="git-hunk-new">+3416</span> <span class="git-hunk">@@</span><span class="git-function-context"> github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882 h1:A7o8tOERTtpD/poS+2VoassCjXpjHn916luXbf5QKD0=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882/go.mod h1:5IwJoz9Pw7JsrCN4/skkxUtSWT7myuUPLhCgv6Q5vvQ=</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/slack-go/slack v0.17.3 h1:zV5qO3Q+WJAQ/XwbGfNFrRMaJ5T/naqaonyPV/1TP4g=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/slack-go/slack v0.17.3/go.mod h1:X+UqOufi3LYQHDnMG1vxf0J8asC6+WllXrVrhl8/Prk=</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=</span>
</div></pre>
]]></description>
<author>
	Joseph Crowell
	(joseph.w.crowell@gmail.com)
</author>
<pubDate>Tue, 23 Dec 2025 12:27:44 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/a2afe786f031e3608f379a28e495a47f4686ffdd</link>
<title>also add the tag to the dockerfile
</title>
<guid>a2afe78
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">a2afe786f031e3608f379a28e495a47f4686ffdd</span> <span class="git-refs"></span>
Author: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue Dec 23 22:35:29 2025 +0000</span>

<span class="git-message-line">    also add the tag to the dockerfile</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/Dockerfile</span> <span class="git-file-b">b/Dockerfile</span>
<span class="git-index">index</span> <span class="git-index-old">4f349e4</span>..<span class="git-index-new">67baf54</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">Dockerfile</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">Dockerfile</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-87</span> <span class="git-hunk-new">+87</span> <span class="git-hunk">@@</span><span class="git-function-context"> COPY . /go/src/matterbridge</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>RUN apk --no-cache add git</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>RUN cd /go/src/matterbridge &amp;&amp; \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>    CGO_ENABLED=0 go build -ldflags &#34;-X github.com/matterbridge-org/matterbridge/version.GitHash=$(git log --pretty=format:&#39;%h&#39; -n 1)&#34; -o /bin/matterbridge</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>    CGO_ENABLED=0 go build -tags goolm -ldflags &#34;-X github.com/matterbridge-org/matterbridge/version.GitHash=$(git log --pretty=format:&#39;%h&#39; -n 1)&#34; -o /bin/matterbridge</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>FROM alpine</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>RUN apk --no-cache add ca-certificates mailcap</span>
</div></pre>
]]></description>
<author>
	Joseph Crowell
	(joseph.w.crowell@gmail.com)
</author>
<pubDate>Tue, 23 Dec 2025 12:35:29 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/867a5dc1ee72dd2d7bb027d3fba31f654c96bb84</link>
<title>also add the tag to the first golangci-lint run
</title>
<guid>867a5dc
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">867a5dc1ee72dd2d7bb027d3fba31f654c96bb84</span> <span class="git-refs"></span>
Author: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue Dec 23 14:20:53 2025 +0000</span>

<span class="git-message-line">    also add the tag to the first golangci-lint run</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/.github/workflows/development.yml</span> <span class="git-file-b">b/.github/workflows/development.yml</span>
<span class="git-index">index</span> <span class="git-index-old">ddf6efd</span>..<span class="git-index-new">21d16a1</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">.github/workflows/development.yml</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">.github/workflows/development.yml</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-276</span> <span class="git-hunk-new">+277</span> <span class="git-hunk">@@</span><span class="git-function-context"> jobs:</span>
<span class="git-message-line">           # Only compare with previous commit when pushing,</span>
<span class="git-message-line">           # and with base branch when in PR.</span>
<span class="git-message-line">           only-new-issues: true</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>          args: --build-tags=goolm</span>
<span class="git-message-line">       - name: golangci-lint (entire codebase)</span>
<span class="git-message-line">         uses: golangci/golangci-lint-action@v8</span>
<span class="git-message-line">         with:</span>
</div></pre>
]]></description>
<author>
	Joseph Crowell
	(joseph.w.crowell@gmail.com)
</author>
<pubDate>Tue, 23 Dec 2025 04:20:53 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/7526a4908a40e85421c387a00bba45f20bb30b50</link>
<title>correct the test to also use goolm
</title>
<guid>7526a49
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">7526a4908a40e85421c387a00bba45f20bb30b50</span> <span class="git-refs"></span>
Author: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue Dec 23 13:50:25 2025 +0000</span>

<span class="git-message-line">    correct the test to also use goolm</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/.github/workflows/development.yml</span> <span class="git-file-b">b/.github/workflows/development.yml</span>
<span class="git-index">index</span> <span class="git-index-old">dea3666</span>..<span class="git-index-new">ddf6efd</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">.github/workflows/development.yml</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">.github/workflows/development.yml</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-478</span> <span class="git-hunk-new">+478</span> <span class="git-hunk">@@</span><span class="git-function-context"> jobs:</span>
<span class="git-message-line">         uses: actions/checkout@v5</span>
<span class="git-message-line">       - name: go fmt ./... (go version ${{ matrix.go-version }})</span>
<span class="git-message-line">         run: test -z &#34;$(go fmt ./...)&#34;</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>      - name: go test ./... (go version ${{ matrix.go-version }})</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>        run: go test ./...</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>      - name: go test -tags goolm ./... (go version ${{ matrix.go-version }})</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>        run: go test -tags goolm ./...</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  build-upload:</span>
<span class="git-message-line">     # Uploading artifacts only if lint/test succeeded</span>
<span class="git-message-line">     needs: [ &#34;lint&#34;, &#34;test&#34; ]</span>
</div></pre>
]]></description>
<author>
	Joseph Crowell
	(joseph.w.crowell@gmail.com)
</author>
<pubDate>Tue, 23 Dec 2025 03:50:25 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/14731a9d174657247d35037284f142ab50316092</link>
<title>--build-tags is assigned in the actions file using = not a space
</title>
<guid>14731a9
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">14731a9d174657247d35037284f142ab50316092</span> <span class="git-refs"></span>
Author: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Tue Dec 23 13:29:56 2025 +0000</span>

<span class="git-message-line">    --build-tags is assigned in the actions file using = not a space</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/.github/workflows/development.yml</span> <span class="git-file-b">b/.github/workflows/development.yml</span>
<span class="git-index">index</span> <span class="git-index-old">3ea71ff</span>..<span class="git-index-new">dea3666</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">.github/workflows/development.yml</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">.github/workflows/development.yml</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-317</span> <span class="git-hunk-new">+317</span> <span class="git-hunk">@@</span><span class="git-function-context"> jobs:</span>
<span class="git-message-line">         uses: golangci/golangci-lint-action@v8</span>
<span class="git-message-line">         with:</span>
<span class="git-message-line">           version: v2.1</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>          args: --build-tags goolm --config=.golangci-incremental.yaml</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>          args: --build-tags=goolm --config=.golangci-incremental.yaml</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  test:</span>
<span class="git-message-line">     strategy:</span>
<span class="git-message-line">       matrix:</span>
</div></pre>
]]></description>
<author>
	Joseph Crowell
	(joseph.w.crowell@gmail.com)
</author>
<pubDate>Tue, 23 Dec 2025 03:29:56 GMT</pubDate>
</item><item>
<link>/rani/matterbridge.git/show/fb6d2b8ff23b7d41a5d5c0c39455d9bc558231be</link>
<title>update Dockerfile, compiling instructions and github workflow to include the goolm flag
</title>
<guid>fb6d2b8
</guid>
<description><![CDATA[
<link rel="stylesheet" href="/static/git-show.css">
<pre><div class="git-show"><span class="git-commit">commit</span> <span class="git-hash">fb6d2b8ff23b7d41a5d5c0c39455d9bc558231be</span> <span class="git-refs"></span>
Author: Joseph Crowell &lt;joseph.w.crowell@gmail.com&gt;
<span class="git-date-label">Date:</span> <span class="git-date">Fri Dec 19 11:54:53 2025 +0000</span>

<span class="git-message-line">    update Dockerfile, compiling instructions and github workflow to include the goolm flag</span>

<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/.github/workflows/development.yml</span> <span class="git-file-b">b/.github/workflows/development.yml</span>
<span class="git-index">index</span> <span class="git-index-old">da84ade</span>..<span class="git-index-new">3ea71ff</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">.github/workflows/development.yml</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">.github/workflows/development.yml</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-317</span> <span class="git-hunk-new">+317</span> <span class="git-hunk">@@</span><span class="git-function-context"> jobs:</span>
<span class="git-message-line">         uses: golangci/golangci-lint-action@v8</span>
<span class="git-message-line">         with:</span>
<span class="git-message-line">           version: v2.1</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>          args: --config=.golangci-incremental.yaml</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>          args: --build-tags goolm --config=.golangci-incremental.yaml</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  test:</span>
<span class="git-message-line">     strategy:</span>
<span class="git-message-line">       matrix:</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-727</span> <span class="git-hunk-new">+727</span> <span class="git-hunk">@@</span><span class="git-function-context"> jobs:</span>
<span class="git-message-line">         uses: actions/checkout@v5</span>
<span class="git-message-line">       - name: Build/upload matterbridge for ${{ matrix.platform.goos }}-${{ matrix.arch }}</span>
<span class="git-message-line">         run: |</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>          CGO_ENABLED=0 GOOS=${{ matrix.platform.goos }} GOARCH=${{ matrix.arch }} go build -ldflags &#34;-s -X github.com/matterbridge-org/matterbridge/version.GitHash=$(git log --pretty=format:&#39;%h&#39; -n 1)&#34; -o matterbridge</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>          CGO_ENABLED=0 GOOS=${{ matrix.platform.goos }} GOARCH=${{ matrix.arch }} go build -tags goolm -ldflags &#34;-s -X github.com/matterbridge-org/matterbridge/version.GitHash=$(git log --pretty=format:&#39;%h&#39; -n 1)&#34; -o matterbridge</span>
<span class="git-message-line">       - name: Upload matterbridge-${{ matrix.name }}-${{ matrix.arch }}</span>
<span class="git-message-line">         uses: actions/upload-artifact@v4</span>
<span class="git-message-line">         with:</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/docs/compiling.md</span> <span class="git-file-b">b/docs/compiling.md</span>
<span class="git-index">index</span> <span class="git-index-old">382da89</span>..<span class="git-index-new">209005b</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">docs/compiling.md</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">docs/compiling.md</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-824</span> <span class="git-hunk-new">+830</span> <span class="git-hunk">@@</span><span class="git-function-context"> Go 1.18+ is required. Make sure you have [Go](https://golang.org/doc/install) pr</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>Building the binary with **all** the bridges enabled needs about 3GB RAM to compile.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>You can reduce this memory requirement to 0,5GB RAM by adding the `nomsteams` tag if you don&#39;t need/use the Microsoft Teams bridge.</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>Matterbridge can be build without gcc/c-compiler: If you&#39;re running on windows first run `set CGO_ENABLED=0` on other platforms you prepend `CGO_ENABLED=0` to the `go build` command. (eg `CGO_ENABLED=0 go install github.com/matterbridge-org/matterbridge`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>Matterbridge can be build without gcc/c-compiler: If you&#39;re running on windows first run `set CGO_ENABLED=0` on other platforms you prepend `CGO_ENABLED=0` to the `go build` command. (eg `CGO_ENABLED=0 go build -tags goolm github.com/matterbridge-org/matterbridge`)</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>To build the from the cloned GitHub repository without installing run in the root project directory:</span>
<span class="git-line-added"><span class="git-diff-plus">+</span></span>
<span class="git-line-added"><span class="git-diff-plus">+</span>```bash</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>go build -tags goolm</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>```</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>To install the latest stable run:</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>```bash</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>go install github.com/matterbridge-org/matterbridge</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>go install -tags goolm github.com/matterbridge-org/matterbridge</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>```</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>To install the latest dev run:</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>```bash</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>go install github.com/matterbridge-org/matterbridge@master</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>go install -tags goolm github.com/matterbridge-org/matterbridge@master</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>```</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>To install the latest stable run without msteams or zulip bridge:</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>```bash</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>go install -tags nomsteams,nozulip github.com/matterbridge-org/matterbridge</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>go install -tags goolm,nomsteams,nozulip github.com/matterbridge-org/matterbridge</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>```</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>You should now have matterbridge binary in the ~/go/bin directory:</span>
<span class="git-diff-header">diff --git</span> <span class="git-file-a">a/tgs.Dockerfile</span> <span class="git-file-b">b/tgs.Dockerfile</span>
<span class="git-index">index</span> <span class="git-index-old">b43b147</span>..<span class="git-index-new">0ee1736</span> <span class="git-index-mode">100644</span>
<span class="git-file-path----">---</span> <span class="git-file-location">a/</span><span class="git-file-name">tgs.Dockerfile</span>
<span class="git-file-path-+++">+++</span> <span class="git-file-location">b/</span><span class="git-file-name">tgs.Dockerfile</span>
<span class="git-hunk">@@</span> <span class="git-hunk-old">-57</span> <span class="git-hunk-new">+57</span> <span class="git-hunk">@@</span><span class="git-function-context"> RUN apk add \</span>
<span class="git-message-line">     go \</span>
<span class="git-message-line">     git \</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>  &amp;&amp; cd /go/src/matterbridge \</span>
<span class="git-line-removed"><span class="git-diff-minus">-</span>  &amp;&amp; CGO_ENABLED=0 go build -mod vendor -ldflags &#34;-X github.com/matterbridge-org/matterbridge/version.GitHash=$(git log --pretty=format:&#39;%h&#39; -n 1)&#34; -o /bin/matterbridge</span>
<span class="git-line-added"><span class="git-diff-plus">+</span>  &amp;&amp; CGO_ENABLED=0 go build -tags goolm -mod vendor -ldflags &#34;-X github.com/matterbridge-org/matterbridge/version.GitHash=$(git log --pretty=format:&#39;%h&#39; -n 1)&#34; -o /bin/matterbridge</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span></span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>FROM alpine</span>
<span class="git-line-context"><span class="git-diff-space">&nbsp;</span>RUN apk --no-cache add \</span>
</div></pre>
]]></description>
<author>
	Joseph Crowell
	(joseph.w.crowell@gmail.com)
</author>
<pubDate>Fri, 19 Dec 2025 01:54:53 GMT</pubDate>
</item></channel></rss>