<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_7_thread_42771"  />
<title>rulinux.net - Форум - Rulinux.net - [rulinux@conference.jabber.ru]Исходники Бильфреда</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Rulinux.net - [rulinux@conference.jabber.ru]Исходники Бильфреда</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re:[rulinux@conference.jabber.ru]Исходники Бильфреда</title>
<link>https://rulinux.net/message.php?newsid=42771&amp;page=1#218937</link>
<guid>https://rulinux.net/message.php?newsid=42771&amp;page=1#218937</guid>
<pubDate>Thu, 15 Dec 2016 19:14:41 +0300</pubDate>
<description><![CDATA[<p>https://github.com/lockywolf/Billfred/tree/master<br><br></p>]]></description>
</item>
<item>
<title>Re:[rulinux@conference.jabber.ru]Исходники Бильфреда</title>
<link>https://rulinux.net/message.php?newsid=42771&amp;page=1#218935</link>
<guid>https://rulinux.net/message.php?newsid=42771&amp;page=1#218935</guid>
<pubDate>Thu, 15 Dec 2016 16:35:01 +0300</pubDate>
<description><![CDATA[<p>Учетные данные для авторизации в config.py <fieldset><legend>python</legend><div class="highlight python"><br />
<br />
jid = <span class="st0">&quot;billfred@JID&quot;</span> <br />
password = <span class="st0">&quot;password&quot;</span><br />
<br />
room = <span class="st0">&quot;rulinux@conference.jabber.ru&quot;</span> &nbsp;<br />
nick = <span class="st0">&quot;Billfred&quot;</span><br />
<br />
<br />
<span class="kw1">try</span>:<br />
&nbsp; &nbsp; <span class="kw1">from</span> local_config <span class="kw1">import</span> <span class="sy0">*</span><br />
<span class="kw1">except</span> <span class="kw2">ImportError</span>:<br />
&nbsp; &nbsp; <span class="kw1">pass</span><br />
&nbsp;</div></fieldset><br><br> Запуск из SystemD  billfred.service  <fieldset><legend>text</legend><div class="highlight text"><br />
[Service]<br />
Type=simple<br />
TimeoutSec=20<br />
User=bot<br />
Group=bot<br />
Restart=always<br />
RestartSec=120<br />
ExecStart=/path/to/Billi_SI.py --config true<br />
<br />
Environment=&quot;LANG=en_US.UTF-8&quot;<br />
StandardOutput=journal<br />
<br />
[Unit]<br />
Requires=network.target<br />
After=network.target<br />
Description=Jabber bot<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
&nbsp;</div></fieldset></p>]]></description>
</item>
<item>
<title>Re:[rulinux@conference.jabber.ru]Исходники Бильфреда</title>
<link>https://rulinux.net/message.php?newsid=42771&amp;page=1#218934</link>
<guid>https://rulinux.net/message.php?newsid=42771&amp;page=1#218934</guid>
<pubDate>Thu, 15 Dec 2016 16:22:22 +0300</pubDate>
<description><![CDATA[<p>Да есть тут один тип, постоянно живых ищет, он и заставил.</p>]]></description>
</item>
<item>
<title>Re:[rulinux@conference.jabber.ru]Исходники Бильфреда</title>
<link>https://rulinux.net/message.php?newsid=42771&amp;page=1#218933</link>
<guid>https://rulinux.net/message.php?newsid=42771&amp;page=1#218933</guid>
<pubDate>Thu, 15 Dec 2016 16:16:42 +0300</pubDate>
<description><![CDATA[<p>С чего вдруг? Тебя Бильфред заставил? А то со стороны похоже на швыряние партбилета/выкладывание пароля.</p>]]></description>
</item>
<item>
<title>[rulinux@conference.jabber.ru]Исходники Бильфреда</title>
<link>https://rulinux.net/message.php?newsid=42771&amp;page=1#218932</link>
<guid>https://rulinux.net/message.php?newsid=42771&amp;page=1#218932</guid>
<pubDate>Thu, 15 Dec 2016 16:05:45 +0300</pubDate>
<description><![CDATA[<p><fieldset><legend>python</legend><div class="highlight python"><br />
<br />
<span class="co1">#!/usr/bin/env python</span><br />
<span class="co1"># -*- coding: utf-8 -*-</span><br />
<br />
<span class="st0">&quot;&quot;&quot;<br />
&nbsp; &nbsp; SleekXMPP: The Sleek XMPP Library<br />
&nbsp; &nbsp; Copyright (C) 2010&nbsp; Nathanael C. Fritz<br />
&nbsp; &nbsp; This file is part of SleekXMPP.<br />
&nbsp; &nbsp; See the file LICENSE for copying permission.<br />
&quot;&quot;&quot;</span><br />
<br />
<span class="kw1">import</span> <span class="kw3">sys</span><br />
<span class="kw1">import</span> <span class="kw3">os</span><br />
<br />
<span class="kw1">import</span> <span class="kw3">logging</span><br />
<span class="kw1">import</span> <span class="kw3">getpass</span><br />
<span class="kw1">from</span> <span class="kw3">optparse</span> <span class="kw1">import</span> OptionParser<br />
<span class="kw1">from</span> sleekxmpp.<span class="kw3">exceptions</span> <span class="kw1">import</span> IqError, IqTimeout<br />
<br />
<span class="kw1">import</span> sqlite3<br />
<span class="kw1">import</span> <span class="kw3">time</span><br />
<span class="kw1">import</span> <span class="kw3">datetime</span><br />
<br />
<span class="co1">#only for encode HTML entities</span><br />
<span class="kw1">import</span> <span class="kw3">HTMLParser</span><br />
<br />
<span class="kw1">import</span> <span class="kw3">re</span><br />
<span class="kw1">import</span> <span class="kw3">urllib2</span><br />
<span class="kw1">import</span> chardet<br />
<span class="kw1">import</span> feedparser<br />
<br />
<span class="kw1">import</span> sleekxmpp<br />
<br />
<span class="co1"># Forcing UTF8</span><br />
<span class="kw1">if</span> <span class="kw3">sys</span>.<span class="me1">version_info</span> <span class="sy0">&lt;</span> <span class="br0">&#40;</span>3, 0<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">from</span> sleekxmpp.<span class="me1">util</span>.<span class="me1">misc_ops</span> <span class="kw1">import</span> setdefaultencoding<br />
&nbsp; &nbsp; setdefaultencoding<span class="br0">&#40;</span><span class="st0">'utf8'</span><span class="br0">&#41;</span><br />
<span class="kw1">else</span>:<br />
&nbsp; &nbsp; <span class="kw2">raw_input</span> = <span class="kw2">input</span><br />
<br />
<span class="kw1">class</span> MUCBot<span class="br0">&#40;</span>sleekxmpp.<span class="me1">ClientXMPP</span><span class="br0">&#41;</span>:<br />
<br />
&nbsp; &nbsp; regex_url = <span class="kw3">re</span>.<span class="kw2">compile</span><span class="br0">&#40;</span>r<span class="st0">&quot;(https?://<span class="es0">\S</span>+)<span class="es0">\.</span>(<span class="es0">\S</span>+)&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; regex_title = <span class="kw3">re</span>.<span class="kw2">compile</span><span class="br0">&#40;</span>r<span class="st0">&quot;&lt;title&gt;([^&lt;]+)&lt;/title&gt;&quot;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; url_ext_blacklist = <span class="br0">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'png'</span>, <span class="st0">'jpg'</span>, <span class="st0">'jpeg'</span>, <span class="st0">'gif'</span>, <span class="st0">'png'</span>, <span class="st0">'pdf'</span>, <span class="st0">'doc'</span>, <span class="st0">'xls'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'docx'</span>, <span class="st0">'djvu'</span>, <span class="st0">'ppt'</span>, <span class="st0">'pptx'</span>, <span class="st0">'avi'</span>, <span class="st0">'mp4'</span>, <span class="st0">'mp3'</span>, <span class="st0">'flac'</span>, <span class="st0">'pps'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'mp3'</span>, <span class="st0">'ogg'</span>, <span class="st0">'webm'</span><br />
&nbsp; &nbsp; <span class="br0">&#93;</span><br />
<br />
&nbsp; &nbsp; h_parser = <span class="kw3">HTMLParser</span>.<span class="kw3">HTMLParser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, jid, password, room, nick<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; sleekxmpp.<span class="me1">ClientXMPP</span>.<span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, jid, password<span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">room</span> = room<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">nick</span> = nick<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">add_event_handler</span><span class="br0">&#40;</span><span class="st0">&quot;session_start&quot;</span>, &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">start</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">add_event_handler</span><span class="br0">&#40;</span><span class="st0">&quot;groupchat_message&quot;</span>, <span class="kw2">self</span>.<span class="me1">muc_message</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">schedule</span><span class="br0">&#40;</span><span class="st0">'RSS update'</span>, &nbsp; &nbsp; &nbsp;<span class="co1"># Unique name for the timer</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">600</span>,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># Seconds to delay before firing</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">rss_update</span>, <span class="co1"># Callback to execute</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; args=<span class="br0">&#40;</span><span class="br0">&#41;</span>,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># A tuple of positional argument values</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; kwargs=<span class="br0">&#123;</span><span class="br0">&#125;</span>,&nbsp; &nbsp; &nbsp; &nbsp;<span class="co1"># A dictionary of keyword argument values</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; repeat=<span class="kw2">True</span><span class="br0">&#41;</span>&nbsp; &nbsp; &nbsp;<span class="co1"># Make the event happen every X seconds</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> rss_update<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; url_rss = <span class="st0">'http://rulinux.net/rss'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; rss_depth_time = 600<br />
&nbsp; &nbsp; &nbsp; &nbsp; current_time = <span class="kw3">datetime</span>.<span class="kw3">datetime</span>.<span class="me1">utcnow</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rss = feedparser.<span class="me1">parse</span><span class="br0">&#40;</span>url_rss<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> r <span class="kw1">in</span> rss.<span class="me1">entries</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time_rss = <span class="kw3">datetime</span>.<span class="kw3">datetime</span>.<span class="me1">fromtimestamp</span><span class="br0">&#40;</span><span class="kw3">time</span>.<span class="me1">mktime</span><span class="br0">&#40;</span>r.<span class="me1">published_parsed</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#print current_time</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t = current_time - time_rss<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#TODO: normal time pars not like {-(3600*3)} for remove 3 hour</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time_delta = t.<span class="me1">total_seconds</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-<span class="br0">&#40;</span>3600<span class="sy0">*</span>3<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>0 <span class="sy0">&lt;</span> time_delta<span class="br0">&#41;</span> &nbsp;<span class="kw1">and</span> <span class="br0">&#40;</span>time_delta <span class="sy0">&lt;</span> rss_depth_time<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; news_title = <span class="kw2">unicode</span><span class="br0">&#40;</span>r.<span class="me1">title</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; news_link &nbsp;= <span class="kw2">unicode</span><span class="br0">&#40;</span>r.<span class="me1">link</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">send_message</span><span class="br0">&#40;</span>mto=<span class="st0">&quot;rulinux@conference.jabber.ru&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mbody=<span class="st0">&quot;RULIN: %s %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>news_title, news_link<span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mtype=<span class="st0">'groupchat'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">logging</span>.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;DEBUG: RSS Feed problem, %s&quot;</span> , <span class="kw3">sys</span>.<span class="me1">exc_info</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> write_log<span class="br0">&#40;</span><span class="kw2">self</span>,query<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#TODO: Сделать раоту базы в тредах иначе приходится на каждый тред открывать и закрывать</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#SQLite objects created in a thread can only be used in that same thread</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#connect_db = sqlite3.connect('./rulinux_xmpp_chat_logs.db')</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; connect_db = sqlite3.<span class="me1">connect</span><span class="br0">&#40;</span><span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">dirname</span><span class="br0">&#40;</span>__file__<span class="br0">&#41;</span>, <span class="st0">'rulinux_xmpp_chat_logs.db'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; cursor_db = connect_db.<span class="me1">cursor</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cursor_db.<span class="me1">execute</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;&quot;INSERT INTO chat_log (id, time, jit, name, message)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; VALUES (NULL,?,?,?,?)&quot;&quot;&quot;</span>, query<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; connect_db.<span class="me1">commit</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; connect_db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> start<span class="br0">&#40;</span><span class="kw2">self</span>, event<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">get_roster</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">send_presence</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">plugin</span><span class="br0">&#91;</span><span class="st0">'xep_0045'</span><span class="br0">&#93;</span>.<span class="me1">joinMUC</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">room</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">nick</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># If a room password is needed, use:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># password=the_room_password,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wait=<span class="kw2">True</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> muc_message<span class="br0">&#40;</span><span class="kw2">self</span>, msg<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Cmopose data and write message to &nbsp;SQLite DB</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; nick_name = <span class="kw2">unicode</span><span class="br0">&#40;</span>msg<span class="br0">&#91;</span><span class="st0">'mucnick'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="co1"># User nick sowed in chat room</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; full_jit &nbsp;= <span class="kw2">unicode</span><span class="br0">&#40;</span>msg<span class="br0">&#91;</span><span class="st0">'from'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &nbsp; &nbsp;<span class="co1"># Like user@jabb.en/UserName</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; message &nbsp; = <span class="kw2">unicode</span><span class="br0">&#40;</span>msg<span class="br0">&#91;</span><span class="st0">'body'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &nbsp; &nbsp;<span class="co1"># Message body</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; query = <span class="br0">&#40;</span><span class="kw3">time</span>.<span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, full_jit, nick_name, message,<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">write_log</span><span class="br0">&#40;</span>query<span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Disable self-interaction</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> msg<span class="br0">&#91;</span><span class="st0">'mucnick'</span><span class="br0">&#93;</span> == <span class="kw2">self</span>.<span class="me1">nick</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Try to run command</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> msg<span class="br0">&#91;</span><span class="st0">'body'</span><span class="br0">&#93;</span>.<span class="me1">startswith</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">nick</span><span class="br0">&#41;</span>:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tokens = msg<span class="br0">&#91;</span><span class="st0">'body'</span><span class="br0">&#93;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span>tokens<span class="br0">&#41;</span> <span class="sy0">&gt;</span> 1:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command = tokens<span class="br0">&#91;</span>1<span class="br0">&#93;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> command == <span class="st0">'ping'</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">try_ping</span><span class="br0">&#40;</span>msg<span class="br0">&#91;</span><span class="st0">'from'</span><span class="br0">&#93;</span>, msg<span class="br0">&#91;</span><span class="st0">'mucnick'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elif</span> <span class="st0">&quot;http&quot;</span> <span class="kw1">in</span> msg<span class="br0">&#91;</span><span class="st0">'body'</span><span class="br0">&#93;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">try_say_url_info</span><span class="br0">&#40;</span>msg<span class="br0">&#91;</span><span class="st0">'body'</span><span class="br0">&#93;</span>, msg<span class="br0">&#91;</span><span class="st0">'from'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> try_say_url_info<span class="br0">&#40;</span><span class="kw2">self</span>, text, mucjid<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parse_result = <span class="kw3">re</span>.<span class="me1">search</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">regex_url</span>, text<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw1">not</span> parse_result:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">logging</span>.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;DEBUG: cant find&nbsp; URL&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">raise</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url_ext = parse_result.<span class="me1">group</span><span class="br0">&#40;</span>2<span class="br0">&#41;</span>.<span class="me1">lower</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span>&nbsp; url_ext <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">url_ext_blacklist</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">logging</span>.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;DEBUG: url extension blocked&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">raise</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url = parse_result.<span class="me1">group</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span> + <span class="st0">&quot;.&quot;</span> + parse_result.<span class="me1">group</span><span class="br0">&#40;</span>2<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; req = <span class="kw3">urllib2</span>.<span class="me1">Request</span><span class="br0">&#40;</span>url<span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#TODO: добавить ограничение на очередь запросов</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response = <span class="kw3">urllib2</span>.<span class="me1">urlopen</span><span class="br0">&#40;</span>req, timeout = <span class="nu0">2</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#6000 MAGIC number&nbsp; for header in bytes, working on youtube</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data &nbsp;= response.<span class="me1">read</span><span class="br0">&#40;</span><span class="nu0">6000</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; enc &nbsp; = chardet.<span class="me1">detect</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data &nbsp;= data.<span class="me1">decode</span><span class="br0">&#40;</span>enc<span class="br0">&#91;</span><span class="st0">'encoding'</span><span class="br0">&#93;</span>, errors=<span class="st0">'ignore'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title = <span class="kw3">re</span>.<span class="me1">search</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">regex_title</span>, data<span class="br0">&#41;</span>.<span class="me1">group</span><span class="br0">&#40;</span>1<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title_clean = <span class="kw2">self</span>.<span class="me1">h_parser</span>.<span class="me1">unescape</span><span class="br0">&#40;</span>title<span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">send_message</span><span class="br0">&#40;</span>mto=mucjid.<span class="me1">bare</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mbody=<span class="st0">&quot;TITLE: %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>title_clean<span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mtype=<span class="st0">'groupchat'</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span>: &nbsp;<span class="co1">#IOError: &nbsp;IndexError, urllib2.URLError</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">logging</span>.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;DEBUG URL Rarsing error: %s&quot;</span>, <span class="kw3">sys</span>.<span class="me1">exc_info</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">def</span> try_ping<span class="br0">&#40;</span><span class="kw2">self</span>, pingjid, nick<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rtt = <span class="kw2">self</span><span class="br0">&#91;</span><span class="st0">'xep_0199'</span><span class="br0">&#93;</span>.<span class="me1">ping</span><span class="br0">&#40;</span>pingjid,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timeout=10<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">send_message</span><span class="br0">&#40;</span>mto=pingjid.<span class="me1">bare</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mbody=<span class="st0">&quot;%s, pong is: %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>nick, rtt<span class="br0">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mtype=<span class="st0">'groupchat'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#logging.info(&quot;Success! RTT: %s&quot;, rtt)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span> IqError <span class="kw1">as</span> e:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">logging</span>.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;Error pinging %s: %s&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pingjid,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">iq</span><span class="br0">&#91;</span><span class="st0">'error'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">'condition'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span> IqTimeout:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">logging</span>.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;No response from %s&quot;</span>, pingjid<span class="br0">&#41;</span><br />
<br />
<span class="kw1">if</span> __name__ == <span class="st0">'__main__'</span>:<br />
&nbsp; &nbsp; optp = OptionParser<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># Output verbosity options.</span><br />
&nbsp; &nbsp; optp.<span class="me1">add_option</span><span class="br0">&#40;</span><span class="st0">'-q'</span>, <span class="st0">'--quiet'</span>, <span class="kw2">help</span>=<span class="st0">'set logging to ERROR'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; action=<span class="st0">'store_const'</span>, dest=<span class="st0">'loglevel'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const=<span class="kw3">logging</span>.<span class="me1">ERROR</span>, default=<span class="kw3">logging</span>.<span class="me1">INFO</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; optp.<span class="me1">add_option</span><span class="br0">&#40;</span><span class="st0">'-d'</span>, <span class="st0">'--debug'</span>, <span class="kw2">help</span>=<span class="st0">'set logging to DEBUG'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; action=<span class="st0">'store_const'</span>, dest=<span class="st0">'loglevel'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const=<span class="kw3">logging</span>.<span class="me1">DEBUG</span>, default=<span class="kw3">logging</span>.<span class="me1">INFO</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; optp.<span class="me1">add_option</span><span class="br0">&#40;</span><span class="st0">'-v'</span>, <span class="st0">'--verbose'</span>, <span class="kw2">help</span>=<span class="st0">'set logging to COMM'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; action=<span class="st0">'store_const'</span>, dest=<span class="st0">'loglevel'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const=5, default=<span class="kw3">logging</span>.<span class="me1">INFO</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># JID and password options.</span><br />
&nbsp; &nbsp; optp.<span class="me1">add_option</span><span class="br0">&#40;</span><span class="st0">&quot;-c&quot;</span>, <span class="st0">&quot;--config&quot;</span>, dest=<span class="st0">&quot;config&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">help</span>=<span class="st0">&quot;import config with connection params&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; optp.<span class="me1">add_option</span><span class="br0">&#40;</span><span class="st0">&quot;-j&quot;</span>, <span class="st0">&quot;--jid&quot;</span>, dest=<span class="st0">&quot;jid&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">help</span>=<span class="st0">&quot;JID to use&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; optp.<span class="me1">add_option</span><span class="br0">&#40;</span><span class="st0">&quot;-p&quot;</span>, <span class="st0">&quot;--password&quot;</span>, dest=<span class="st0">&quot;password&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">help</span>=<span class="st0">&quot;password to use&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; optp.<span class="me1">add_option</span><span class="br0">&#40;</span><span class="st0">&quot;-r&quot;</span>, <span class="st0">&quot;--room&quot;</span>, dest=<span class="st0">&quot;room&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">help</span>=<span class="st0">&quot;MUC room to join&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; optp.<span class="me1">add_option</span><span class="br0">&#40;</span><span class="st0">&quot;-n&quot;</span>, <span class="st0">&quot;--nick&quot;</span>, dest=<span class="st0">&quot;nick&quot;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">help</span>=<span class="st0">&quot;MUC nickname&quot;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; opts, args = optp.<span class="me1">parse_args</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># Setup logging.</span><br />
&nbsp; &nbsp; <span class="kw3">logging</span>.<span class="me1">basicConfig</span><span class="br0">&#40;</span>level=opts.<span class="me1">loglevel</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; format=<span class="st0">'%(levelname)-8s %(message)s'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; <span class="kw1">if</span> opts.<span class="me1">config</span> <span class="kw1">is</span> <span class="kw2">None</span>: &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> opts.<span class="me1">jid</span> <span class="kw1">is</span> <span class="kw2">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opts.<span class="me1">jid</span> = <span class="kw2">raw_input</span><span class="br0">&#40;</span><span class="st0">&quot;Username: &quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> opts.<span class="me1">password</span> <span class="kw1">is</span> <span class="kw2">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opts.<span class="me1">password</span> = <span class="kw3">getpass</span>.<span class="kw3">getpass</span><span class="br0">&#40;</span><span class="st0">&quot;Password: &quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> opts.<span class="me1">room</span> <span class="kw1">is</span> <span class="kw2">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opts.<span class="me1">room</span> = <span class="kw2">raw_input</span><span class="br0">&#40;</span><span class="st0">&quot;MUC room: &quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> opts.<span class="me1">nick</span> <span class="kw1">is</span> <span class="kw2">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opts.<span class="me1">nick</span> = <span class="kw2">raw_input</span><span class="br0">&#40;</span><span class="st0">&quot;MUC nickname: &quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">import</span> config<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opts.<span class="me1">jid</span> = config.<span class="me1">jid</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opts.<span class="me1">password</span> = config.<span class="me1">password</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opts.<span class="me1">room</span> = config.<span class="me1">room</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; opts.<span class="me1">nick</span> = config.<span class="me1">nick</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span> <span class="kw2">ImportError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;error to import config file&quot;</span> <br />
&nbsp; &nbsp; <span class="co1">#opts.password = getpass.getpass(&quot;Password: &quot;)</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># Setup the MUCBot and register plugins.</span><br />
&nbsp; &nbsp; xmpp = MUCBot<span class="br0">&#40;</span>opts.<span class="me1">jid</span>, opts.<span class="me1">password</span>, opts.<span class="me1">room</span>, opts.<span class="me1">nick</span><span class="br0">&#41;</span><br />
<br />
&nbsp; &nbsp; xmpp.<span class="me1">register_plugin</span><span class="br0">&#40;</span><span class="st0">'xep_0030'</span><span class="br0">&#41;</span> <span class="co1"># Service Discovery</span><br />
&nbsp; &nbsp; xmpp.<span class="me1">register_plugin</span><span class="br0">&#40;</span><span class="st0">'xep_0045'</span><span class="br0">&#41;</span> <span class="co1"># Multi-User Chat</span><br />
&nbsp; &nbsp; xmpp.<span class="me1">register_plugin</span><span class="br0">&#40;</span><span class="st0">'xep_0199'</span><span class="br0">&#41;</span> <span class="co1"># XMPP Ping</span><br />
&nbsp; &nbsp; xmpp.<span class="me1">register_plugin</span><span class="br0">&#40;</span><span class="st0">'xep_0004'</span><span class="br0">&#41;</span> <span class="co1"># Data Forms</span><br />
&nbsp; &nbsp; xmpp.<span class="me1">register_plugin</span><span class="br0">&#40;</span><span class="st0">'xep_0060'</span><span class="br0">&#41;</span> <span class="co1"># PubSub</span><br />
<br />
&nbsp; &nbsp; <span class="co1"># Connect to the XMPP server and start processing XMPP stanzas.</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> xmpp.<span class="me1">connect</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; xmpp.<span class="me1">process</span><span class="br0">&#40;</span>block=<span class="kw2">True</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;Done&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span><span class="br0">&#40;</span><span class="st0">&quot;Unable to connect.&quot;</span><span class="br0">&#41;</span><br />
<br />
&nbsp;</div></fieldset><br><br><br><br>Все костыли которые  не MIT и GPL  распространяются  под паблик домэйн.<br><br>Основная заслуга по написанию кода SystemV,  кодревью Space_ivan и  Невесть кто еще.</p>]]></description>
</item>
</channel>
</rss>