<?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:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>MadSoft</title>
	<atom:link href="http://www.madsoft.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.madsoft.org</link>
	<description></description>
	<pubDate>Sun, 28 Sep 2008 07:13:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>SETI@Home Optimizers on Linux</title>
		<link>http://www.madsoft.org/2008/09/28/setihome-optimizers-on-linux/</link>
		<comments>http://www.madsoft.org/2008/09/28/setihome-optimizers-on-linux/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 07:13:01 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[boinc]]></category>

		<category><![CDATA[client]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[optimized]]></category>

		<category><![CDATA[seti]]></category>

		<category><![CDATA[setiathome]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/?p=45</guid>
		<description><![CDATA[As I am a big proponent of the SETI@Home project as well as a Linux user, discovering that optimized SETI applications existed and how to use them was important. It took quite some time to figure this all out by myself since there are hardly any (from what I could find) resources on SETI@Home optimized [...]]]></description>
			<content:encoded><![CDATA[<p>As I am a big proponent of the SETI@Home project as well as a Linux user, discovering that optimized SETI applications existed and how to use them was important. It took quite some time to figure this all out by myself since there are hardly any (from what I could find) resources on SETI@Home optimized clients on Linux. Eventually I ran into <a href="http://lunatics.kwsn.net/" target="_blank">this</a> site which offers SSE3 and SSSE3 optimized clients for Linux in addition to SSE, SSE2, and SSE3 clients for FreeBSD.</p>
<p>For those of you who don&#8217;t know what SETI@Home optimizers are, they are essentially specialized versions of the standard version of the SETI@Home client which take advantage of extended floating-point instruction sets available to certain x86 (Intel, AMD, or the like) processors. Using these instruction sets allows optimized clients to complete work many times faster than it could before with the standard client. For example, prior to using an SSSE3 optimized client on my Intel Core 2 Quad Q6600 my recent average credit (RAC) on SETI was in the 500 range including one other active machine and now my RAC has spiked over 2,500 not including the other active machine.</p>
<p><span id="more-45"></span>Before we get started, you should make sure that all other active work units you have running are completed before replacing the standard client with an optimized one. Then you may choose which optimize client you will run. Keep in mind that currently, only Intel Core 2 based CPUs and a single VIA CPU are capable of running SSSE3 instructions. For more details on this you should refer to the <a href="http://en.wikipedia.org/wiki/SSSE3" target="_blank">SSSE3 wikipedia page</a>. Otherwise, you will likely be able to run an SSE3 optimized client, unless your CPU is more than several years old, also <a href="http://en.wikipedia.org/wiki/SSE3" target="_blank">refer to wikipedia</a> for more information on this. If you&#8217;ve got an even older CPU, there are also clients for MMX, SSE, and SSE2.</p>
<p>Optionally you may check which instruction sets are supported by your CPU using the following command:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="bash bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>maddog39<span style="color: #000000; font-weight: bold;">@</span>desktop ~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>cpuinfo | <span style="color: #c20cb9; font-weight: bold;">grep</span> flags | <span style="color: #c20cb9; font-weight: bold;">tail</span> <span style="color: #660033;">-n</span> <span style="color: #000000;">1</span>
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm</pre></div></div>

</blockquote>
<p>First thing we want to do is download the client for your respective CPU and kernel version (most likely SSE3 or SSSE3 and kernel 2.6) from <a href="http://lunatics.kwsn.net/discussion-forum/linux-port-of-alex-kans-v8-0.msg8200.html;topicseen#msg8200" target="_blank">this</a> page and extract the tarball. If your using an older CPU requiring an older instruction set, see <a href="http://lunatics.kwsn.net/index.php?module=Downloads;catd=1" target="_blank">this</a> page instead.</p>
<p>Before we actually drop in the optimized client, its probably best to suspend the SETI@Home project in BOINC for safe measure.</p>
<p><a href="http://www.madsoft.org/wp-content/uploads/2008/09/boinc_seti_suspend.png"><img class="alignnone size-full wp-image-54" title="Suspend SETI@Home" src="http://www.madsoft.org/wp-content/uploads/2008/09/boinc_seti_suspend.png" alt="" width="500" height="193" /></a></p>
<p>Now we get to physically install our new SETI@Home optimizer. In the folder you extracted from the tarball, you should find a binary (executable) and an app_info.xml file, either in the folder&#8217;s top directory or in a subsequent sub-folder.</p>
<p><a href="http://www.madsoft.org/wp-content/uploads/2008/09/seti_optimizer_extracted.png"><img class="alignnone size-full wp-image-55" title="Extraced Optimizer Files" src="http://www.madsoft.org/wp-content/uploads/2008/09/seti_optimizer_extracted.png" alt="" width="500" height="342" /></a></p>
<p>You want to copy these files and launch nautilus (or your file manager of choice) as root and point it to the /var/lib/boinc folder. Hit Alt+F2 to bring up a run dialog and enter the command:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="bash bash" style="font-family:monospace;">gksudo nautilus <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>boinc<span style="color: #000000; font-weight: bold;">/</span>projects<span style="color: #000000; font-weight: bold;">/</span>setiathome.berkeley.edu</pre></div></div>

</blockquote>
<p><a href="http://www.madsoft.org/wp-content/uploads/2008/09/run_nautilus_root_boinc_fixed.png"><img class="alignnone size-full wp-image-60" title="Run Nautilus as Root" src="http://www.madsoft.org/wp-content/uploads/2008/09/run_nautilus_root_boinc_fixed.png" alt="" width="461" height="179" /></a></p>
<p>Paste the optimizer files into the directory and when comes up. Finally, you will need to restart the BOINC daemon. On my distribution, Arch Linux its:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="bash bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>boinc restart</pre></div></div>

</blockquote>
<p>Although if you are using Ubuntu, Debian, or a derivative its:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="bash bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>boinc restart</pre></div></div>

</blockquote>
<p>Then, to start using your new SETI optimized client, you simply launch BOINC manager and resume the SETI@Home project. It should start downloading new workunits immediatley and your in business. I hope you found this article useful and keep in mind that I tried to keep it as easy as possible for the newer Linux users out there.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/09/28/setihome-optimizers-on-linux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>QOverclock 0.1</title>
		<link>http://www.madsoft.org/2008/08/13/qoverclock-01/</link>
		<comments>http://www.madsoft.org/2008/08/13/qoverclock-01/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 04:32:25 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[overclocking]]></category>

		<category><![CDATA[qoverclock]]></category>

		<category><![CDATA[qt]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/?p=35</guid>
		<description><![CDATA[I actually wrote this little application quite a few weeks ago, I was just contemplating whether it was worth posting or not. I had just finished building my new PC and was starting to do a lot of overclocking and tweaking. Frustrated by the fact that there weren&#8217;t any Linux or open source alternatives to [...]]]></description>
			<content:encoded><![CDATA[<p>I actually wrote this little application quite a few weeks ago, I was just contemplating whether it was worth posting or not. I had just finished building my new PC and was starting to do a lot of overclocking and tweaking. Frustrated by the fact that there weren&#8217;t any Linux or open source alternatives to overclocking calculators, I quickly wrote one up using Qt 4. It simply calculates the resulting clock speed of your CPU given the FSB and the multiplier. Who knows, maybe somebody will find it useful. I was thinking about adding some tray icon functionality to monitor system temps. as well. Although, I am going to sit on that idea for a little while.</p>
<p><a href="http://www.madsoft.org/wp-content/uploads/2008/08/qoverclock.png"><img class="size-full wp-image-36 alignnone" title="QOverclock 0.1" src="http://www.madsoft.org/wp-content/uploads/2008/08/qoverclock.png" alt="" width="163" height="56" /></a></p>
<p><span style="text-decoration: underline;"><a title="QOverclock 0.1" href="http://dl.madsoft.org/qoverclock-0.1.tar.gz" target="_blank">Download QOverclock 0.1</a></span></p>
<p><span style="text-decoration: underline;"><a title="QOverclock 0.1 (Win32 Binary)" href="http://dl.madsoft.org/qoverclock-0.1-win32.zip" target="_blank">Download QOverclock 0.1 (Win32 Binary)</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/08/13/qoverclock-01/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Small Banshee 1.0 Status Plugin for Pidgin</title>
		<link>http://www.madsoft.org/2008/06/23/small-bashee-10-status-plugin-for-pidgin/</link>
		<comments>http://www.madsoft.org/2008/06/23/small-bashee-10-status-plugin-for-pidgin/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 00:27:48 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[banshee]]></category>

		<category><![CDATA[pidgin]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[status]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/?p=31</guid>
		<description><![CDATA[This took a bit longer to get out than I had originally expected but here it is. As a precursor to my previous post, I wanted to make a new &#8220;plugin&#8221; for pidgin that would update my music status from Banshee because as of the development versions of 1.0, they had an entirely new API [...]]]></description>
			<content:encoded><![CDATA[<p>This took a bit longer to get out than I had originally expected but here it is. As a precursor to my previous post, I wanted to make a new &#8220;plugin&#8221; for pidgin that would update my music status from Banshee because as of the development versions of 1.0, they had an entirely new API in place and other similar plugins hadn&#8217;t (and still aren&#8217;t as far as I know) been updated to work with the new API. So that&#8217;s exactly what I did and its a very simple ~30 line python script that I am putting out to the world in case anyone else wants similar functionality.</p>
<p>Basically you just stick the file in your home directory (or at your option in /usr/bin or /usr/local/bin) and add it to your auto-started applications in GNOME or KDE or put it in your xinitrc or whatever you want. For GNOME users I happen to know that you can do this from System &gt; Preferences &gt; Sessions &gt; Startup Programs &gt; Add. For windows users this script will never run because Banshee is *nix only as well as DBus (as far as I know). Enjoy!</p>
<p><a href="http://www.madsoft.org/wp-content/uploads/2008/06/pidgin_banshee_status.py">Download pidgin_banshee_status.py</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/06/23/small-bashee-10-status-plugin-for-pidgin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Interfacing Banshee 1.0 with DBus and Python</title>
		<link>http://www.madsoft.org/2008/06/10/interfacing-banshee-10-with-dbus-and-python/</link>
		<comments>http://www.madsoft.org/2008/06/10/interfacing-banshee-10-with-dbus-and-python/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 03:35:28 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[banshee]]></category>

		<category><![CDATA[dbus]]></category>

		<category><![CDATA[interface]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/?p=30</guid>
		<description><![CDATA[Ever since the DBUS API change (more like overhaul) during the development of Banshee 1.0 and developers haven&#8217;t yet started supporting it in their plugins so I decided that I would play around with it. From what I have seen, it seems that the perception is that DBus is hard and complicated but its actually [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since the DBUS API change (more like overhaul) during the development of Banshee 1.0 and developers haven&#8217;t yet started supporting it in their plugins so I decided that I would play around with it. From what I have seen, it seems that the perception is that DBus is hard and complicated but its actually really easy and makes things very simple. Essentially you use a DBus debugger (because in most cases, documentation for an applications&#8217; DBus API is not available) like D-Feet to look up which interfaces, methods, properties, and signals are available to you. Then use them to do what you want.</p>
<p><span id="more-30"></span></p>
<p><a href="http://www.madsoft.org/wp-content/uploads/2008/06/dfeet_dbus_debugger.png"><img class="alignnone size-medium wp-image-32" title="dfeet_dbus_debugger" src="http://www.madsoft.org/wp-content/uploads/2008/06/dfeet_dbus_debugger-300x180.png" alt="Bansshe DBus API in D-Feet" width="300" height="180" /></a></p>
<p>Now all we have to do is make a connection to Banshee via DBus and start calling methods. For this we will just use an interactive python interpreter which can be accessed by simply typing &#8220;python&#8221; at any command line prompt. Firstly, we will import the DBuslibrary.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> dbus</pre></div></div>

</blockquote>
<p>Next, we will make a connection to the session bus.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Then we will get Banshee&#8217;s PlayerEngine object which will let us control the player itself (Play, Pause, Next, Previous, Current Track, etc).</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">banshee = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;org.bansheeproject.Banshee&quot;</span>, <span style="color: #483d8b;">&quot;/org/bansheeproject/Banshee/PlayerEngine&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>The first argument we pass, &#8220;org.bansheeproject.Banshee&#8221;, is the interface we want to connect to and &#8220;/org/bansheeproject/Banshee/PlayerEngine&#8221; is the path to the object that we want to use. Now we can start doing stuff with Banshee. You can pretty much take any of the methods listed in D-Feet and run them. For example:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">banshee.<span style="color: black;">Open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;file:///home/maddog39/Music/Eisbrecher - Antikörper.mp3&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>And to play the song&#8230;</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">banshee.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Once you have had enough&#8230;.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">banshee.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Although note that you dont have to using the Open() method to use the Play() and Pause() methods, but Open() lets you open an arbitrary media file otherwise those other methods use the currently playing track. Now, to access properties you generally just take the name of the property and prepend &#8216;Get&#8217; to it and make it a method. So for example:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">banshee.<span style="color: black;">GetCanPause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Returns:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">dbus.Boolean(False)</pre></div></div>

</blockquote>
<p>Or if we wanted to display all the information about the currently playing track we might do&#8230;</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> key <span style="color: #ff7700;font-weight:bold;">in</span> currentTrack.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> key + <span style="color: #483d8b;">&quot;: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>currentTrack<span style="color: black;">&#91;</span>key<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Which gives us:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="none" style="font-family:monospace;">album: Issues
rating: 0
name: Falling Away From Me
artist: Korn
URI: file:///home/maddog39/Music/Korn%20-%20Beating%20Me%20Down.mp3
length: 271.211
disc: 0
track-count: 16
year: 1999
track-number: 2</pre></div></div>

</blockquote>
<p>Another cool thing you can do with DBus is receive signals. What this allows us to do is run code when a given signal is triggered or received. We do this by connecting a python method with a signal on our bus. So if we wanted to do something every time Banshee changes its state (playing, paused, loading, loaded, etc) this is what would happen. We would first have to setup a main loop as it is required for a signals to function.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> gobject
<span style="color: #ff7700;font-weight:bold;">from</span> dbus.<span style="color: black;">mainloop</span>.<span style="color: black;">glib</span> <span style="color: #ff7700;font-weight:bold;">import</span> DBusGMainLoop
dbus.<span style="color: black;">mainloop</span>.<span style="color: black;">glib</span>.<span style="color: black;">DBusGMainLoop</span><span style="color: black;">&#40;</span>set_as_default=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Then we would create a callback method which would be run every time the signal is triggered.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> stateChanged<span style="color: black;">&#40;</span>state<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;State Changed: %s&quot;</span> <span style="color: #66cc66;">%</span> state</pre></div></div>

</blockquote>
<p>Now we can add our signal receiver to our method.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">bus.<span style="color: black;">add_signal_receiver</span><span style="color: black;">&#40;</span>stateChanged,
dbus_interface=<span style="color: #483d8b;">&quot;org.bansheeproject.Banshee.PlayerEngine&quot;</span>,
                        signal_name=<span style="color: #483d8b;">&quot;StateChanged&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Finally, at the end of a script that uses signals we would want to run our main loop.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">gobject.<span style="color: black;">MainLoop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Well thats pretty much it! Just keep in mind that this was not intended to be a tutorial but merely a guideline on how to do interact and do things with Banshee over DBus. So feel free to sit down and write some of your own scripts based on what you have learned here and I hope this helps. I have already written my own program to integrate Banshee into another application which I will talk about in another article. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/06/10/interfacing-banshee-10-with-dbus-and-python/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Easily create IRC bots in Python with PyBotlib</title>
		<link>http://www.madsoft.org/2008/05/09/easily-create-irc-bots-in-python-with-pybotlib/</link>
		<comments>http://www.madsoft.org/2008/05/09/easily-create-irc-bots-in-python-with-pybotlib/#comments</comments>
		<pubDate>Fri, 09 May 2008 19:19:02 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[bot]]></category>

		<category><![CDATA[botlib]]></category>

		<category><![CDATA[client]]></category>

		<category><![CDATA[irc]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/2008/05/09/easily-create-irc-bots-in-python-with-pybotlib/</guid>
		<description><![CDATA[Back when I wrote ProxyBot, I was frustrated by the fact that there was a lack of maintained and documented third party libraries for the IRC client protocol. So I essentially wrote my own implementation of the IRC client protocol for use with the bots that I write. Well I wrote the library to take [...]]]></description>
			<content:encoded><![CDATA[<p>Back when I wrote ProxyBot, I was frustrated by the fact that there was a lack of maintained and documented third party libraries for the IRC client protocol. So I essentially wrote my own implementation of the IRC client protocol for use with the bots that I write. Well I wrote the library to take advantage of OOP (Object Oriented Programming for those who don&#8217;t know) which in turn made it really quick and easy for me to throw together a bot.</p>
<p>So this is a simple little tutorial on how to write a basic &#8220;Hello World&#8221; bot using PyBotlib. The library itself is only a single file so I have not bothered to repackage it or write setup scripts as you will only need import that single file within your application. You may get the latest source code for the library at any time <a title="botlib.py" href="http://ircproxybot.googlecode.com/svn/trunk/botlib.py" target="_blank">here</a> (google code/SVN) or <a title="PyBotlib 1.0" href="http://www.madsoft.org/wp-content/uploads/2008/05/botlib.py" target="_blank">here</a> (blog). So here we go&#8230;</p>
<p><span id="more-28"></span><br />
Lets start by defining our bot class and its constructor.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> botlib
&nbsp;
<span style="color: #808080; font-style: italic;"># Create a new class for our bot, extending the Bot class from botlib</span>
<span style="color: #ff7700;font-weight:bold;">class</span> HelloWorldBot<span style="color: black;">&#40;</span>botlib.<span style="color: black;">Bot</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, server, channel, nick, password=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        botlib.<span style="color: black;">Bot</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, server, <span style="color: #ff4500;">6667</span>, channel, nick<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Send nickserv password if available</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> password <span style="color: #66cc66;">!</span>= <span style="color: #008000;">None</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">protocol</span>.<span style="color: black;">privmsg</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;nickserv&quot;</span>, <span style="color: #483d8b;">&quot;identify&quot;</span> <span style="color: #66cc66;">%</span> password<span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Next we are going to want to override the __actions__ function of the Bot class which will handle all of our bots actions. This acts as essentially a main loop and is called infinitely until the bot is shutdown. In here we put code for our commands, responders, whatever other interaction with the IRC channel that we need.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;">    <span style="color: #ff7700;font-weight:bold;">def</span> __actions__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        botlib.<span style="color: black;">Bot</span>.__actions__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Create a Hello World responder/command</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> botlib.<span style="color: black;">check_found</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">data</span>, <span style="color: #483d8b;">&quot;!hello&quot;</span><span style="color: black;">&#41;</span>:
            <span style="color: #808080; font-style: italic;"># Get the senders username</span>
            username = <span style="color: #008000;">self</span>.<span style="color: black;">get_username</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #808080; font-style: italic;"># Send user a message in response</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">protocol</span>.<span style="color: black;">privmsg</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">channel</span>, <span style="color: #483d8b;">&quot;Hello %s!&quot;</span> <span style="color: #66cc66;">%</span> username<span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>So here, we have created a simple command called !hello which runs the code underneath its if statement when an instance of that command is found in the chat. Then we call the get_username() function of the Bot class (remember that we inherited from the Bot class) to get the user name of the person who initiated the command. After that, we simply send a message back to the channel using the equivalent function for IRC&#8217;s PRIVMSG command. Now all we to do is instantiate and run our new bot.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;"> <span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    <span style="color: #808080; font-style: italic;"># Create new instance of our bot and run it</span>
    HelloWorldBot<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;irc.wyldryde.org&quot;</span>, <span style="color: #483d8b;">&quot;#maddog39&quot;</span>, <span style="color: #483d8b;">&quot;HelloWorldBot&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Keep in mind that when you are instantiating Bot object, that because PyBotlib is entirely threaded, you can make as many instances of your bot as you would like. I do have a BotManager class in PyBotlib intended for managing sets of multiple bots on the same process however I have never actually tested it so your results may vary. Here is the script in its entirety.</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="python python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> botlib
&nbsp;
<span style="color: #808080; font-style: italic;"># Create a new class for our bot, extending the Bot class from botlib</span>
<span style="color: #ff7700;font-weight:bold;">class</span> HelloWorldBot<span style="color: black;">&#40;</span>botlib.<span style="color: black;">Bot</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, server, channel, nick, password=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        botlib.<span style="color: black;">Bot</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, server, <span style="color: #ff4500;">6667</span>, channel, nick<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Send nickserv password if availible</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> password <span style="color: #66cc66;">!</span>= <span style="color: #008000;">None</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">protocol</span>.<span style="color: black;">privmsg</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;nickserv&quot;</span>, <span style="color: #483d8b;">&quot;identify&quot;</span> <span style="color: #66cc66;">%</span> password<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> __actions__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        botlib.<span style="color: black;">Bot</span>.__actions__<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Create a Hello World responder/command</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> botlib.<span style="color: black;">check_found</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">data</span>, <span style="color: #483d8b;">&quot;!hello&quot;</span><span style="color: black;">&#41;</span>:
            <span style="color: #808080; font-style: italic;"># Get the senders username</span>
            username = <span style="color: #008000;">self</span>.<span style="color: black;">get_username</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #808080; font-style: italic;"># Send user a message in response</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">protocol</span>.<span style="color: black;">privmsg</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">channel</span>, <span style="color: #483d8b;">&quot;Hello %s!&quot;</span> <span style="color: #66cc66;">%</span> username<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    <span style="color: #808080; font-style: italic;"># Create new instance of our bot and run it</span>
    HelloWorldBot<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;irc.wyldryde.org&quot;</span>, <span style="color: #483d8b;">&quot;#maddog39&quot;</span>, <span style="color: #483d8b;">&quot;HelloWorldBot&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</blockquote>
<p>Finally, to run your new bot, simply issue the command:</p>
<blockquote>

<div class="wp_syntax"><div class="code"><pre class="bash bash" style="font-family:monospace;">python helloworldbot.py</pre></div></div>

</blockquote>
<p>At the terminal prompt or command prompt (windows). Also note that you must make sure that your botlib.py file is in the same directory as your bot. Have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/05/09/easily-create-irc-bots-in-python-with-pybotlib/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Reusing 3rd Party Libraries in Web Development</title>
		<link>http://www.madsoft.org/2008/04/14/reusing-3rd-pary-libraries-in-web-development/</link>
		<comments>http://www.madsoft.org/2008/04/14/reusing-3rd-pary-libraries-in-web-development/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 23:24:13 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[libraries]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/2008/04/14/reusing-3rd-pary-libraries-in-web-development/</guid>
		<description><![CDATA[Ever since I have been getting back into the swing of Web Development, working on one of my projects, I really took notice to something. Whenever you see a PHP application out there that is free to download and you start looking through how they did things. You start to see that generally many web [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since I have been getting back into the swing of Web Development, working on one of my projects, I really took notice to something. Whenever you see a PHP application out there that is free to download and you start looking through how they did things. You start to see that generally many web application developers (particularly PHP developers) will tend to rewrite many back end libraries for things such as the templating engine or database abstraction layer (DBAL) when there are so many libraries which do exactly the same thing and in many cases, much more. So my question is, why are we as developers wasting so much of our time rewriting things which are already there for us instead of using them to reach our intended goal? I recently asked myself this question while working on one of my projects.</p>
<p>I realized that I had wasted several months of my time developing what I called a &#8220;framework&#8221; for PHP when it was really not very full featured and actually made things extremely hard for myself in the large scheme of things. After doing some homework, I had found really rich libraries that allowed me to do things beyond my wildest dreams before. Projects such as <a href="http://www.smarty.net/" target="_blank">Smarty</a>, <a href="http://www.jquery.com/" target="_blank">jQuery</a>, and <a href="http://tinymce.moxiecode.com/" target="_blank">TinyMCE</a> just to name a few. What really gets me though is that many free (as in beer or potentially as in free speech) projects constantly fall behind because they take  forever to their own things such as rich text editors and ajax frameworks while their users are wondering why they don&#8217;t have the features they are looking for.</p>
<p>So  this is a call to all web developers out there. You really need to start reassessing  the libraries you write and think of how you could possibly use others&#8217; great Open Source projects to assist you in the development of your application. Stop reinventing the wheel and start innovating, that&#8217;s what we are all about, right?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/04/14/reusing-3rd-pary-libraries-in-web-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ProxyBot 0.7 Stable Released</title>
		<link>http://www.madsoft.org/2008/03/12/proxybot-07-stable-released/</link>
		<comments>http://www.madsoft.org/2008/03/12/proxybot-07-stable-released/#comments</comments>
		<pubDate>Wed, 12 Mar 2008 21:31:27 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[proxybot]]></category>

		<category><![CDATA[release]]></category>

		<category><![CDATA[stable]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/2008/03/12/proxybot-07-stable-released/</guid>
		<description><![CDATA[So there were some things that were in need of tweaking in the last version, so I have now released version 0.7. Due to popular demand I have implemented support for MySQL in addition to Postgres. I tried getting SQLite to work but it isn&#8217;t thread safe and would require a new instance in every [...]]]></description>
			<content:encoded><![CDATA[<p>So there were some things that were in need of tweaking in the last version, so I have now released version 0.7. Due to popular demand I have implemented support for MySQL in addition to Postgres. I tried getting SQLite to work but it isn&#8217;t thread safe and would require a new instance in every thread which makes things messy and does not work with the current database abstraction layer. So until I can pass SQLite instances across threads, that feature will not work. I put some more details in the readme which is included with the source distribution. I am always open to feedback so feel free.</p>
<p><a href="http://code.google.com/p/ircproxybot/downloads/list" target="_blank">Download ProxyBot</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/03/12/proxybot-07-stable-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ProxyBot 0.6 Stable Released</title>
		<link>http://www.madsoft.org/2008/03/07/proxybot-06-stable-released/</link>
		<comments>http://www.madsoft.org/2008/03/07/proxybot-06-stable-released/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 03:30:09 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[proxybot]]></category>

		<category><![CDATA[release]]></category>

		<category><![CDATA[stable]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/2008/03/07/proxybot-06-stable-released/</guid>
		<description><![CDATA[Although I was finished with this about a month ago, I just haven&#8217;t gotten around to it until now. So here it is. Its the first stable release of ProxyBot, my port scanning IRC bot, version 0.6. As far as usage goes, its pretty self explanatory, simply download the tarball or zip archive and change [...]]]></description>
			<content:encoded><![CDATA[<p>Although I was finished with this about a month ago, I just haven&#8217;t gotten around to it until now. So here it is. Its the first stable release of ProxyBot, my port scanning IRC bot, version 0.6. As far as usage goes, its pretty self explanatory, simply download the tarball or zip archive and change directory into the proxybot folder and run the main.py file from the command line. For a set of command line options simply use &#8211;help or no arguments at all. As usual its Open Source and under the GNU GPL v3 and a copy of the license is included with the distribution. I currently don&#8217;t plan on addinany more features so if you have any ideas, please feel free to contact me and let me know.</p>
<p><a href="http://code.google.com/p/ircproxybot/downloads/list" target="_blank">Download ProxyBot</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/03/07/proxybot-06-stable-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ProxyBot and PyBotlib</title>
		<link>http://www.madsoft.org/2008/02/08/proxybot-and-pybotlib/</link>
		<comments>http://www.madsoft.org/2008/02/08/proxybot-and-pybotlib/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 21:42:08 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[bots]]></category>

		<category><![CDATA[irc]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/?p=23</guid>
		<description><![CDATA[Recently, some of my friends had inspired me to start looking into how to make IRC bots. Well I did, and honestly I was fascinated by it. So anyway, I made my own implementation of the IRC specification as well as my first bot in python within a day or so. Since then I&#8217;ve made [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, some of my friends had inspired me to start looking into how to make IRC bots. Well I did, and honestly I was fascinated by it. So anyway, I made my own implementation of the IRC specification as well as my first bot in python within a day or so. Since then I&#8217;ve made a bot which I called ProxyBot which allows a user to do things like portscans or an IP range/hostname and or a port range. If the bot finds a port open, it logs it to a PgSQL database which can then be searched later on for all IPs which have  a given port open. It will also do standard hostname resolution. I will be releasing the source code under the GPLv3 and it will be avalible for download shortly.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/02/08/proxybot-and-pybotlib/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Blog Has Moved</title>
		<link>http://www.madsoft.org/2008/02/03/blog-has-moved/</link>
		<comments>http://www.madsoft.org/2008/02/03/blog-has-moved/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 19:58:01 +0000</pubDate>
		<dc:creator>Alec Hussey</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.madsoft.org/?p=22</guid>
		<description><![CDATA[Yea, well I&#8217;ve decided that I wanted to move to a new blogging system as well as having the ability to use my own domain. So I&#8217;ve moved the blog and all of its previous posts over to my website at www.madsoft.org running (of course) wordpress. At the moment its all default (i apologize) but [...]]]></description>
			<content:encoded><![CDATA[<p>Yea, well I&#8217;ve decided that I wanted to move to a new blogging system as well as having the ability to use my own domain. So I&#8217;ve moved the blog and all of its previous posts over to my website at www.madsoft.org running (of course) wordpress. At the moment its all default (i apologize) but I should have something a little more unique up soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.madsoft.org/2008/02/03/blog-has-moved/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
