<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.insomnia247.nl/index.php?action=history&amp;feed=atom&amp;title=Source_code</id>
	<title>Source code - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.insomnia247.nl/index.php?action=history&amp;feed=atom&amp;title=Source_code"/>
	<link rel="alternate" type="text/html" href="https://wiki.insomnia247.nl/index.php?title=Source_code&amp;action=history"/>
	<updated>2026-04-18T21:25:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=622&amp;oldid=prev</id>
		<title>imported&gt;Wikiadmin: Blanked the page</title>
		<link rel="alternate" type="text/html" href="https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=622&amp;oldid=prev"/>
		<updated>2011-02-25T13:22:27Z</updated>

		<summary type="html">&lt;p&gt;Blanked the page&lt;/p&gt;
&lt;a href=&quot;https://wiki.insomnia247.nl/index.php?title=Source_code&amp;amp;diff=622&amp;amp;oldid=621&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>imported&gt;Wikiadmin</name></author>
	</entry>
	<entry>
		<id>https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=621&amp;oldid=prev</id>
		<title>imported&gt;Wikiadmin at 13:16, 25 February 2011</title>
		<link rel="alternate" type="text/html" href="https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=621&amp;oldid=prev"/>
		<updated>2011-02-25T13:16:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:16, 25 February 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Source code listing for nanobot ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Source code listing for nanobot ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Code with syntax highlighting can be found [http://insomnia247.nl/g/?dir=p&amp;amp;file=nanobot&amp;amp;ext=pl&amp;amp;type=perl here]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Code with syntax highlighting can be found [http://&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;www.&lt;/ins&gt;insomnia247.nl/g/?dir=p&amp;amp;file=nanobot&amp;amp;ext=pl&amp;amp;type=perl here]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;Wikiadmin</name></author>
	</entry>
	<entry>
		<id>https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=620&amp;oldid=prev</id>
		<title>imported&gt;Wikiadmin at 13:15, 25 February 2011</title>
		<link rel="alternate" type="text/html" href="https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=620&amp;oldid=prev"/>
		<updated>2011-02-25T13:15:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:15, 25 February 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Source code listing for nanobot ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Source code listing for nanobot ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Code with syntax highlighting can be found here&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Code with syntax highlighting can be found &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[http://insomnia247.nl/g/?dir=p&amp;amp;file=nanobot&amp;amp;ext=pl&amp;amp;type=perl &lt;/ins&gt;here&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;Wikiadmin</name></author>
	</entry>
	<entry>
		<id>https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=619&amp;oldid=prev</id>
		<title>imported&gt;Wikiadmin at 13:14, 25 February 2011</title>
		<link rel="alternate" type="text/html" href="https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=619&amp;oldid=prev"/>
		<updated>2011-02-25T13:14:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:14, 25 February 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Source code listing for nanobot ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Source code listing for nanobot ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Code with syntax highlighting can be found here&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pre&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Copyright (c) 2011, Insomnia 24/7 All rights reserved.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Copyright (c) 2011, Insomnia 24/7 All rights reserved.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Redistribution and use in source and binary forms, with or without&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Redistribution and use in source and binary forms, with or without&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1160&quot;&gt;Line 1,160:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1,162:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	exit(0);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	exit(0);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;code&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pre&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;Wikiadmin</name></author>
	</entry>
	<entry>
		<id>https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=618&amp;oldid=prev</id>
		<title>imported&gt;Wikiadmin: Created page with &#039;== Source code listing for nanobot == &lt;code&gt; # Copyright (c) 2011, Insomnia 24/7 All rights reserved.  # Redistribution and use in source and binary forms, with or without # modi…&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.insomnia247.nl/index.php?title=Source_code&amp;diff=618&amp;oldid=prev"/>
		<updated>2011-02-25T13:12:55Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;#039;== Source code listing for nanobot == &amp;lt;code&amp;gt; # Copyright (c) 2011, Insomnia 24/7 All rights reserved.  # Redistribution and use in source and binary forms, with or without # modi…&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Source code listing for nanobot ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Copyright (c) 2011, Insomnia 24/7 All rights reserved. &lt;br /&gt;
# Redistribution and use in source and binary forms, with or without&lt;br /&gt;
# modification, are permitted provided that the following conditions are met:&lt;br /&gt;
 &lt;br /&gt;
# Redistributions of source code must retain the above copyright notice, this&lt;br /&gt;
# list of conditions and the following disclaimer. Redistributions in binary&lt;br /&gt;
# form must reproduce the above copyright notice, this list of conditions and&lt;br /&gt;
# the following disclaimer in the documentation and/or other materials&lt;br /&gt;
# provided with the distribution. Neither the name of Insomnia 24/7 nor&lt;br /&gt;
# the names of its contributors may be used to endorse or promote products&lt;br /&gt;
# derived from this software without specific prior written permission.&lt;br /&gt;
 &lt;br /&gt;
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS IS&amp;quot;&lt;br /&gt;
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&lt;br /&gt;
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE&lt;br /&gt;
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR&lt;br /&gt;
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL&lt;br /&gt;
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR&lt;br /&gt;
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER&lt;br /&gt;
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT&lt;br /&gt;
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY&lt;br /&gt;
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH&lt;br /&gt;
# DAMAGE.&lt;br /&gt;
 &lt;br /&gt;
#!/usr/local/bin/perl&lt;br /&gt;
 &lt;br /&gt;
package nanobot;&lt;br /&gt;
 &lt;br /&gt;
use IO::Socket::INET6;&lt;br /&gt;
use Module::Load;&lt;br /&gt;
 &lt;br /&gt;
$version = &amp;quot;Nanobot 3.0 beta 5&amp;quot;;&lt;br /&gt;
$server = &amp;#039;irc.insomnia247.nl&amp;#039;; # Hostname, IPv4 or IPv6 address.&lt;br /&gt;
$port = 6667;&lt;br /&gt;
$sslport = 6669;&lt;br /&gt;
$botnick = &amp;#039;nanobot&amp;#039;; # Bots nickname&lt;br /&gt;
$botuser = &amp;#039;nanobot&amp;#039;; # Bots username&lt;br /&gt;
$nsp = &amp;#039;&amp;#039;; # NickServ pasword (if not registered, leave empty)&lt;br /&gt;
@channels = (&amp;quot;#bots&amp;quot;, &amp;quot;#yourchannel&amp;quot;);&lt;br /&gt;
@opers = (&amp;quot;insomnia247.nl&amp;quot;, &amp;quot;rootedker.nl&amp;quot;, &amp;quot;fbi.gov&amp;quot;, &amp;quot;eye.spy&amp;quot;); # Oper(s) hostmask(s)&lt;br /&gt;
$modchan = &amp;#039;#yourchannel&amp;#039;;&lt;br /&gt;
$datadir = &amp;#039;botdata&amp;#039;;&lt;br /&gt;
$moddir = &amp;#039;modules&amp;#039;;&lt;br /&gt;
@autoload = (); # List modules to load on startup. Example: @autoload(&amp;quot;mymodule&amp;quot;, &amp;quot;kickban&amp;quot;);&lt;br /&gt;
$wisecrack_seen_botnick = &amp;quot;I&amp;#039;m right here. I mean ... really, how did you miss that one?&amp;quot;;&lt;br /&gt;
$wisecrack_seen_self = &amp;quot;I can see you! You&amp;#039;re right there! That&amp;#039;s right, I can see.&amp;quot;;&lt;br /&gt;
$wait_for_ping = 0; # Set to 1 if your network requires a ping reply before allowing to join channels.&lt;br /&gt;
$connect_timeout = 120; # Seconds to wait before giving up connnecting to the IRC server.&lt;br /&gt;
$ping_timeout = 300; # Seconds to wait before assuming timeout and attempting reconnect.&lt;br /&gt;
 &lt;br /&gt;
# These are set by the bot itself, do not modify&lt;br /&gt;
$logging = 1;&lt;br /&gt;
$debug = 0;&lt;br /&gt;
$op_all = 0;&lt;br /&gt;
$hop_all = 0;&lt;br /&gt;
$voice_all = 0;&lt;br /&gt;
$botstatus = 1;&lt;br /&gt;
$startup = time;&lt;br /&gt;
%seenlog = ();&lt;br /&gt;
%seentime = ();&lt;br /&gt;
$public_modules = 0;&lt;br /&gt;
@modules = ();&lt;br /&gt;
 &lt;br /&gt;
##### Process commandline options #####&lt;br /&gt;
foreach $arg (@ARGV) {&lt;br /&gt;
	if ($arg eq &amp;quot;-h&amp;quot; or $arg eq &amp;quot;--help&amp;quot;) {&lt;br /&gt;
		print &amp;quot;options:\n&amp;quot;;&lt;br /&gt;
		print &amp;quot;  -h or --help		Print this help.\n&amp;quot;;&lt;br /&gt;
		print &amp;quot;  -v or --version	Print version number and exit.\n&amp;quot;;&lt;br /&gt;
		print &amp;quot;  -q or --quiet		Activate silent mode (Nothing is printed to the screen.)\n&amp;quot;;&lt;br /&gt;
		print &amp;quot;  -d or --debug		Enable debugging output. (Use twice for greater effect.\n&amp;quot;;&lt;br /&gt;
		print &amp;quot;  -s or --ssl		Use ssl.\n&amp;quot;;&lt;br /&gt;
		print &amp;quot;  -6 or --ipv6		Use IPv6 over IPv4.\n&amp;quot;;&lt;br /&gt;
		&amp;amp;shutd;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if ($arg eq &amp;quot;-v&amp;quot; or $arg eq &amp;quot;--version&amp;quot;) { print &amp;quot;version: $version\n&amp;quot;; &amp;amp;shutd;}&lt;br /&gt;
	if ($arg eq &amp;quot;-q&amp;quot; or $arg eq &amp;quot;--quiet&amp;quot;) {$logging = 0;}&lt;br /&gt;
	if ($arg eq &amp;quot;-d&amp;quot; or $arg eq &amp;quot;--debug&amp;quot;) {$debug++;}&lt;br /&gt;
	if ($arg eq &amp;quot;-s&amp;quot; or $arg eq &amp;quot;--ssl&amp;quot;) {&lt;br /&gt;
		$ssl = 1;&lt;br /&gt;
		$port = $sslport;&lt;br /&gt;
		use IO::Socket::SSL;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Kick things off ######&lt;br /&gt;
logts(&amp;quot;Nanobot is starting...\n&amp;quot;);&lt;br /&gt;
&amp;amp;directories;&lt;br /&gt;
while(1) {&lt;br /&gt;
	&amp;amp;connct;&lt;br /&gt;
	sleep(2);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Check for data and module directories ######&lt;br /&gt;
sub directories {&lt;br /&gt;
	logts(&amp;quot;Data folder .......... &amp;quot;);&lt;br /&gt;
	if (-d $datadir) {&lt;br /&gt;
		logts(&amp;quot;[OK]\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		if (mkdir $datadir) {&lt;br /&gt;
			logts(&amp;quot;[CREATED]\n&amp;quot;);		&lt;br /&gt;
		} else {&lt;br /&gt;
			logts(&amp;quot;[FAILED]\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	logts(&amp;quot;Modules folder ....... &amp;quot;);&lt;br /&gt;
	if (-d $moddir) {&lt;br /&gt;
		logts(&amp;quot;[OK]\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		if (mkdir $moddir) {&lt;br /&gt;
			logts(&amp;quot;[CREATED]\n&amp;quot;);		&lt;br /&gt;
		} else {&lt;br /&gt;
			logts(&amp;quot;[FAILED]\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Screen output subroutine #####&lt;br /&gt;
sub logts {&lt;br /&gt;
	if ($logging == 1){&lt;br /&gt;
		print STDOUT &amp;quot;$_[0]&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Debug output subroutine #####&lt;br /&gt;
sub debug {&lt;br /&gt;
	if ($debug &amp;gt;= 1){&lt;br /&gt;
		print STDOUT &amp;quot;$_[0]&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
sub debug_extra {&lt;br /&gt;
	if ($debug == 2){&lt;br /&gt;
		($s,$m,$h,$d,$mo) = gmtime( time );&lt;br /&gt;
		print STDOUT &amp;quot;[$h:$m:$s] $_[0]&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Connect to server ######&lt;br /&gt;
sub connct {&lt;br /&gt;
	debug(&amp;quot;Attempting connect.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	# Connect to server&lt;br /&gt;
	logts(&amp;quot;Connecting ........... &amp;quot;);&lt;br /&gt;
	$sock = IO::Socket::INET6-&amp;gt;new(	PeerAddr =&amp;gt; $server,&lt;br /&gt;
									PeerPort =&amp;gt; $port,&lt;br /&gt;
									Proto =&amp;gt; &amp;#039;tcp&amp;#039;,&lt;br /&gt;
									Domain =&amp;gt; AF_UNSPEC,&lt;br /&gt;
									Timeout =&amp;gt; $connect_timeout) or die &amp;quot;Connect error: $!\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	logts(&amp;quot;[OK]\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	if($ssl) {&lt;br /&gt;
		logts(&amp;quot;Starting SSL ......... &amp;quot;);&lt;br /&gt;
		IO::Socket::SSL-&amp;gt;start_SSL( $sock,&lt;br /&gt;
									SSL_verify_mode =&amp;gt; 0, # Do not verify certificate&lt;br /&gt;
									) or die &amp;quot;SSL handshake failed: $SSL_ERROR&amp;quot;;&lt;br /&gt;
		logts(&amp;quot;[OK]\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	debug(&amp;quot;Connected to server: $server\non port: $port\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	# Set nick and username&lt;br /&gt;
	logts(&amp;quot;Sending user info .... &amp;quot;);&lt;br /&gt;
	snd(&amp;quot;NICK $botnick&amp;quot;);&lt;br /&gt;
	snd(&amp;quot;USER $botuser 8 *  :$version&amp;quot;);&lt;br /&gt;
	logts(&amp;quot;[OK]\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	# Catch SIGALRM from the OS when timeout expired.&lt;br /&gt;
	local $SIG{ALRM} = sub {$sock-&amp;gt;shutdown(0);};&lt;br /&gt;
	&lt;br /&gt;
	# Send all incomming data to the parser&lt;br /&gt;
	while (&amp;lt;$sock&amp;gt;) {&lt;br /&gt;
		eval {&lt;br /&gt;
			alarm 0;&lt;br /&gt;
			&amp;amp;parse($_);&lt;br /&gt;
			alarm $ping_timeout;&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	debug(&amp;quot;Closing socket.\n&amp;quot;);&lt;br /&gt;
	close $sock;&lt;br /&gt;
	logts(&amp;quot;Error: Lost connection, reconnecting...\n&amp;quot;);&lt;br /&gt;
	$login = undef;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Subroutine for sending data to the IRC server #####&lt;br /&gt;
sub snd {&lt;br /&gt;
	print $sock &amp;quot;$_[0]\n&amp;quot;;&lt;br /&gt;
	debug_extra(&amp;quot;&amp;lt;== $_[0]\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Subroutine for sending messages to the IRC server #####&lt;br /&gt;
sub msg {&lt;br /&gt;
	snd(&amp;quot;PRIVMSG $_[0] :$_[1]&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Subroutine for sending notices to the IRC server #####&lt;br /&gt;
sub ntc {&lt;br /&gt;
	snd(&amp;quot;NOTICE $_[0] :$_[1]&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Socket input parser #####&lt;br /&gt;
sub parse {&lt;br /&gt;
	debug_extra(&amp;quot;==&amp;gt; $_&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	# Remove /r and /n&lt;br /&gt;
	chop($_);&lt;br /&gt;
	chop($_);&lt;br /&gt;
	&lt;br /&gt;
	# Do nickserv auth and channel join&lt;br /&gt;
	if(!$login &amp;amp;&amp;amp; ($wait_for_ping == 0)) {&lt;br /&gt;
		&amp;amp;login;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Handle PING and rejoin on kick&lt;br /&gt;
	if (/^PING \:(.+)/) {&lt;br /&gt;
		debug(&amp;quot;Received PING request.\n&amp;quot;);&lt;br /&gt;
		snd(&amp;quot;PONG :$1&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		if(!$login &amp;amp;&amp;amp; ($wait_for_ping == 1)) {&lt;br /&gt;
			&amp;amp;login;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		debug(&amp;quot;Sent PONG reply.\n&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	} elsif (/^\:(.+?)!(.+?)@(.+?) KICK #(.+?) \Q$botnick\E \:(.+?)/) {&lt;br /&gt;
		snd(&amp;quot;JOIN #$4&amp;quot;);&lt;br /&gt;
		debug(&amp;quot;Rejoined channel $4 after kick.\n&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Hook for modules that want raw data&lt;br /&gt;
	foreach $module (@modules) {&lt;br /&gt;
		if( $module-&amp;gt;can(&amp;#039;raw&amp;#039;) ) {&lt;br /&gt;
			$module-&amp;gt;raw($_);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Process generic NOTICE&lt;br /&gt;
	if (/^\:(.+?)!(.+?)@(.+?) NOTICE (.+?) \:(.+)/) {&lt;br /&gt;
		# Hook for modules that want all messages&lt;br /&gt;
		foreach $module (@modules) {&lt;br /&gt;
			if( $module-&amp;gt;can(&amp;#039;notice&amp;#039;) ) {&lt;br /&gt;
				$module-&amp;gt;notice($1, $2, $3, $4, $modchan, $botnick, $5);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Process generic JOIN actions&lt;br /&gt;
	if (/^\:(.+?)!(.+?)@(.+?) JOIN \:(.+)/) {&lt;br /&gt;
		&lt;br /&gt;
		# Parse regex results&lt;br /&gt;
		$join{from} = $1;&lt;br /&gt;
		$join{user} = $2;&lt;br /&gt;
		$join{host} = $3;&lt;br /&gt;
		$join{rcpt} = $4;&lt;br /&gt;
		$join{text} = $5;&lt;br /&gt;
		$args = $join{text};&lt;br /&gt;
 &lt;br /&gt;
		$from = $join{from};&lt;br /&gt;
		$uname = $join{user};&lt;br /&gt;
		$host = $join{host};&lt;br /&gt;
		$from_chan = $join{rcpt};&lt;br /&gt;
 &lt;br /&gt;
		# Hook for modules that want join actions&lt;br /&gt;
		foreach $module (@modules) {&lt;br /&gt;
			if( $module-&amp;gt;can(&amp;#039;join&amp;#039;) ) {&lt;br /&gt;
				$module-&amp;gt;join($from, $uname, $host, $from_chan, $modchan, $botnick);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	# Process autojoin actions for modchan&lt;br /&gt;
	if($botstatus == 1){&lt;br /&gt;
		if (/^\:(.+?)!(.+?)@(.+?) JOIN \:$modchan/) {&lt;br /&gt;
			$join{from} = $1;&lt;br /&gt;
			$join{user} = $2;&lt;br /&gt;
			$join{host} = $3;&lt;br /&gt;
			$join{rcpt} = $4;&lt;br /&gt;
			$join{text} = $5;&lt;br /&gt;
			$args = $join{text};&lt;br /&gt;
			$from = $join{from};&lt;br /&gt;
			$send_host = $join{host};&lt;br /&gt;
 &lt;br /&gt;
			if ($op_all == 1) {&lt;br /&gt;
				snd(&amp;quot;MODE $modchan +o $1&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				foreach $aop (@aop) {&lt;br /&gt;
					chomp($aop);&lt;br /&gt;
					if ($aop eq $3) {&lt;br /&gt;
						snd(&amp;quot;MODE $modchan +o $1&amp;quot;);&lt;br /&gt;
						logts(&amp;quot;AOPped $1\n&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
				&lt;br /&gt;
			if ($hop_all == 1) {&lt;br /&gt;
				snd(&amp;quot;MODE $modchan +h $1&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				foreach $ahop (@ahop) {&lt;br /&gt;
					chomp($ahop);&lt;br /&gt;
					if ($ahop eq $3) {&lt;br /&gt;
						snd(&amp;quot;MODE $modchan +h $1&amp;quot;);&lt;br /&gt;
						logts(&amp;quot;AHOPped $1\n&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			if ($voice_all == 1) {&lt;br /&gt;
				snd(&amp;quot;MODE $modchan +v $1&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				foreach $av (@av) {&lt;br /&gt;
					chomp($av);&lt;br /&gt;
					if ($av eq $3) {&lt;br /&gt;
						snd(&amp;quot;MODE $modchan +v $1&amp;quot;);&lt;br /&gt;
						logts(&amp;quot;AVoiced $1\n&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			foreach $ak (@ak) {&lt;br /&gt;
				chomp($ak);&lt;br /&gt;
				if ($ak eq $3) {&lt;br /&gt;
					snd(&amp;quot;KICK $modchan $1&amp;quot;);&lt;br /&gt;
					logts(&amp;quot;AKicked $1\n&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	# Process messages&lt;br /&gt;
	if (/^\:(.+?)!(.+?)@(.+?) PRIVMSG (.+?) \:(.+)/) {&lt;br /&gt;
		$privmsg{from} = $1;&lt;br /&gt;
		$privmsg{user} = $2;&lt;br /&gt;
		$privmsg{host} = $3;&lt;br /&gt;
		$privmsg{rcpt} = $4;&lt;br /&gt;
		$privmsg{text} = $5;&lt;br /&gt;
		$args = $privmsg{text};&lt;br /&gt;
 &lt;br /&gt;
		$from = $privmsg{from};&lt;br /&gt;
		$uname = $privmsg{user};&lt;br /&gt;
		$host = $privmsg{host};&lt;br /&gt;
		$from_chan = $privmsg{rcpt};&lt;br /&gt;
 &lt;br /&gt;
		# Log data for seen log&lt;br /&gt;
		if($args !~ /\a/) {&lt;br /&gt;
			$seenlog{lc $from} = $args;&lt;br /&gt;
			$seentime{lc $from} = time;&lt;br /&gt;
			debug(&amp;quot;$from_chan &amp;lt;$from&amp;gt; $args\n&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			debug(&amp;quot;Ignored term bell from $from for seen log.\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		# Parse commands&lt;br /&gt;
		if($args =~ /^!version/) { &amp;amp;version; }&lt;br /&gt;
		elsif($args =~ /^!uptime /) { &amp;amp;uptime; }&lt;br /&gt;
		elsif($args =~ /^!seen /) { &amp;amp;seen; }&lt;br /&gt;
		elsif($args =~ /^!help/) { &amp;amp;help; }&lt;br /&gt;
		elsif($args =~ /^!loaded/) { &amp;amp;loaded; }&lt;br /&gt;
		elsif($args =~ /^!available/) { &amp;amp;available; }&lt;br /&gt;
		elsif($args =~ /^!load /) { if($public_modules == 1) { &amp;amp;loadmodule; } }&lt;br /&gt;
		elsif($args =~ /^!unload /) { if($public_modules == 1) { &amp;amp;unloadmodule; } }&lt;br /&gt;
		elsif($args =~ /^!reload /) { if($public_modules == 1) { &amp;amp;unloadmodule; &amp;amp;loadmodule; } }&lt;br /&gt;
		elsif($args =~ /^!\w/) { &amp;amp;pubcmd;&lt;br /&gt;
		} else {&lt;br /&gt;
			# Hook for modules that want all messages&lt;br /&gt;
			foreach $module (@modules) {&lt;br /&gt;
				if( $module-&amp;gt;can(&amp;#039;mesg&amp;#039;) ) {&lt;br /&gt;
					$module-&amp;gt;mesg($from, $uname, $host, $from_chan, $modchan, $botnick, $args);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		 &lt;br /&gt;
		# Operator commands&lt;br /&gt;
		foreach $oper (@opers) { &lt;br /&gt;
			if ($oper eq $host) { &lt;br /&gt;
				if($args =~ /^!load /) { if($public_modules == 0) { &amp;amp;loadmodule; } }&lt;br /&gt;
				elsif($args =~ /^!unload /) { if($public_modules == 0) { &amp;amp;unloadmodule } }&lt;br /&gt;
				elsif($args =~ /^!reload /) { if($public_modules == 0) { &amp;amp;unloadmodule; &amp;amp;loadmodule; } }&lt;br /&gt;
				elsif($args =~ /^!raw /) { &amp;amp;raw; } &lt;br /&gt;
				elsif($args =~ /^!msg /) { &amp;amp;mesg; } &lt;br /&gt;
				elsif($args =~ /^!quit/) { &amp;amp;botquit; } &lt;br /&gt;
				elsif($args =~ /^!join /) { &amp;amp;joinchan; }&lt;br /&gt;
				elsif($args =~ /^!part /) { &amp;amp;partchan; }&lt;br /&gt;
 				elsif($args =~ /^!nick /) { &amp;amp;nick; }&lt;br /&gt;
 				elsif($args =~ /^!op/) { &amp;amp;oper; }&lt;br /&gt;
 				elsif($args =~ /^!deop/) { &amp;amp;deoper; }&lt;br /&gt;
 				elsif($args =~ /^!hop/) { &amp;amp;halfoper; }	&lt;br /&gt;
				elsif($args =~ /^!dehop/) { &amp;amp;dehalfoper; }&lt;br /&gt;
				elsif($args =~ /^!voice/) { &amp;amp;voice; }&lt;br /&gt;
 				elsif($args =~ /^!devoice/) { &amp;amp;devoice; } &lt;br /&gt;
				elsif($args =~ /^!kick /) { &amp;amp;kick; }&lt;br /&gt;
 				elsif($args =~ /^!ban /) { &amp;amp;ban; } &lt;br /&gt;
				elsif($args =~ /^!unban /) { &amp;amp;unban; }&lt;br /&gt;
				elsif($args =~ /^!topic /) { &amp;amp;topic; }&lt;br /&gt;
				elsif($args =~ /^!mode /) { &amp;amp;mode; }&lt;br /&gt;
				elsif($args =~ /^!loadlist /) { &amp;amp;loadlists; }&lt;br /&gt;
 				elsif($args =~ /^!modchan/) { &amp;amp;modchan; } &lt;br /&gt;
				elsif($args =~ /^!bot/) { &amp;amp;botswitch; }&lt;br /&gt;
 				elsif($args =~ /^!pubmods/) { &amp;amp;pubmods; }&lt;br /&gt;
 				elsif($args =~ /^!admin/) { &amp;amp;admin; } &lt;br /&gt;
				elsif($args =~ /^!all /) { &amp;amp;all; }&lt;br /&gt;
 				elsif($args =~ /^!none /) { &amp;amp;none; }&lt;br /&gt;
 				elsif($args =~ /^!add /) { &amp;amp;add; }&lt;br /&gt;
 				elsif($args =~ /^!\w/) { &amp;amp;admincmd; }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Meta subroutine for initial join ######&lt;br /&gt;
sub login {&lt;br /&gt;
	debug(&amp;quot;Entered initial join loop.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	# Attempt nickserv login&lt;br /&gt;
	&amp;amp;nickserv;&lt;br /&gt;
 &lt;br /&gt;
	# Join all listed channels&lt;br /&gt;
	&amp;amp;joinlist;&lt;br /&gt;
 &lt;br /&gt;
	# We&amp;#039;ve done login and join, no need to do it again next time&lt;br /&gt;
	$login = 1;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### NickServ AUTH ######&lt;br /&gt;
sub nickserv{&lt;br /&gt;
	if ($nsp) {&lt;br /&gt;
		logts(&amp;quot;Identifying nick ..... &amp;quot;);&lt;br /&gt;
		msg(&amp;quot;NickServ&amp;quot;, &amp;quot;identify $nsp&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;[OK]\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Join listed channels #####&lt;br /&gt;
sub joinlist {&lt;br /&gt;
	logts(&amp;quot;Joining channel(s) ... &amp;quot;);&lt;br /&gt;
	foreach $chan (@channels) {&lt;br /&gt;
		snd(&amp;quot;JOIN $chan&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	logts(&amp;quot;[OK]\n&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	# Also call autoload modules now&lt;br /&gt;
	&amp;amp;autoload;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Attempt to autoload specified modules #####&lt;br /&gt;
sub autoload {&lt;br /&gt;
	foreach $loadme (@autoload) {&lt;br /&gt;
		&amp;amp;autoloadmodule($loadme);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !version #####&lt;br /&gt;
sub version {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;version\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	ntc(&amp;quot;$from&amp;quot;, &amp;quot;Running version: $version&amp;quot;);&lt;br /&gt;
	my $uptime = &amp;amp;diffString(time - $startup);&lt;br /&gt;
	ntc(&amp;quot;$from&amp;quot;, &amp;quot;Uptime: $uptime&amp;quot;);&lt;br /&gt;
	logts(&amp;quot;Sending version to $from.\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !seen #####&lt;br /&gt;
sub seen {&lt;br /&gt;
	if($botstatus == 1) {&lt;br /&gt;
		debug(&amp;quot;Received \&amp;quot;seen\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
		if(!substr($args, 6)) {&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;No user was specified!&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			$usr = substr($args, 6);&lt;br /&gt;
			$usr =~ s/\s+$//;&lt;br /&gt;
 &lt;br /&gt;
			if( lc $usr eq lc $botnick ) {&lt;br /&gt;
				msg(&amp;quot;$from_chan&amp;quot;, &amp;quot;$wisecrack_seen_botnick&amp;quot;);&lt;br /&gt;
			} elsif( lc $usr eq lc $from ) {&lt;br /&gt;
				msg(&amp;quot;$from_chan&amp;quot;, &amp;quot;$wisecrack_seen_self&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				# Check if we have a log for this user&lt;br /&gt;
				my $seen = 0;&lt;br /&gt;
				for my $key (keys(%seenlog)) {&lt;br /&gt;
					if ($key eq lc $usr) { $seen = 1; }&lt;br /&gt;
	   			}&lt;br /&gt;
 &lt;br /&gt;
				if ($seen == 1) {&lt;br /&gt;
					my $diff = &amp;amp;diffString(time - $seentime{lc $usr});&lt;br /&gt;
					msg(&amp;quot;$from_chan&amp;quot;, &amp;quot;$usr was last seen $diff ago saying: &amp;quot;);&lt;br /&gt;
					msg(&amp;quot;$from_chan&amp;quot;, &amp;quot;$seenlog{lc $usr}&amp;quot;);&lt;br /&gt;
					logts(&amp;quot;Sending seen info for $usr\n&amp;quot;);&lt;br /&gt;
					debug(&amp;quot;$seenlog{lc $usr}&amp;quot;);&lt;br /&gt;
				} else {&lt;br /&gt;
					my $uptime = &amp;amp;diffString(time - $startup);&lt;br /&gt;
					ntc(&amp;quot;$from&amp;quot;, &amp;quot;No log for $usr&amp;quot;);&lt;br /&gt;
					ntc(&amp;quot;$from&amp;quot;, &amp;quot;Log goes back $uptime&amp;quot;);&lt;br /&gt;
					logts(&amp;quot;No log entry for $usr found\n&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Translate difference in seconds to human readable string #####&lt;br /&gt;
sub diffString {&lt;br /&gt;
	($s,$m,$h,$d,$mo) = gmtime( $_[0] );&lt;br /&gt;
	&lt;br /&gt;
	if( $mo &amp;gt; 0 ) {&lt;br /&gt;
		$returnstring = &amp;quot;$mo months, $d days, $h hours, $m minutes and $s seconds&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$d--;&lt;br /&gt;
		if( $d &amp;gt; 0 ) {&lt;br /&gt;
			$returnstring = &amp;quot;$d days, $h hours, $m minutes and $s seconds&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			if( $h &amp;gt; 0 ) {&lt;br /&gt;
				$returnstring = &amp;quot;$h hours, $m minutes and $s seconds&amp;quot;;			&lt;br /&gt;
			} else {&lt;br /&gt;
				if( $m &amp;gt; 0 ) {&lt;br /&gt;
					$returnstring = &amp;quot;$m minutes and $s seconds&amp;quot;;&lt;br /&gt;
				} else {&lt;br /&gt;
					$returnstring = &amp;quot;$s seconds&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	} &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !help #####&lt;br /&gt;
sub help {&lt;br /&gt;
	if (substr($args, 6) eq &amp;quot;yes&amp;quot;) { &lt;br /&gt;
		debug(&amp;quot;Received \&amp;quot;help\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Help for $botnick version $version.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;�Public commands:�&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!help Get this help.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!version Get version number.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!seen [user] Get the last thing a user said.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;�Oper only commands:�&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!quit [message] Stop bot.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!join [channel] Join channel.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!part [channel] Part channel.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!topic New topic.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!mode [user/chan] +/-mode&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!nick [botnick] Change the bots nickname.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!loadlist Load auto-lists.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!modchan [channel] Set active channel. Returms current active channel when none is given.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!bot [on|off] Switch bot on or off.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!all [op|hop|voice] Give status to every user to enter the channel.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!none [op|hop|voice] Stop the !all command.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!add [op|hop|voice|kick] [hostmask] Add hostmask to auto-list.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;![op|deop|hop|dehop|voice|devoice|kick] [nick] Preform direct action.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;![ban|unban] [hostmask] Ban hosts from the active channel.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!admin [add|del] [hostmask] Control admin access to the bot. (No args returns current list)&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!raw [data] Send raw commands to the IRC server.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot; &amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;�Module commands:�&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;![load|unload|reload] [module] Load / unload / reload a module.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!loaded List currently loaded modules.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!available List all available modules.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!pubmods [on|off] Switch public usage of modules on or off.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;!module.function Call a loaded modules functions.&amp;quot;);&lt;br /&gt;
				&lt;br /&gt;
		logts(&amp;quot;Sent help to $from.\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;This command sends about 30 lines of notices.&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Use \&amp;quot;!help yes\&amp;quot; if you are sure you want to do this.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !raw #####&lt;br /&gt;
sub raw {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;raw\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	my ($cmd,@data) = split(/ /, $args);&lt;br /&gt;
	snd(&amp;quot;@data&amp;quot;);&lt;br /&gt;
	logts(&amp;quot;Raw command was used by $from.\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !msg #####&lt;br /&gt;
sub mesg {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;msg\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	my ($cmd, $to, @data) = split(/ /, $args);&lt;br /&gt;
	snd(&amp;quot;PRIVMSG $to :@data&amp;quot;);&lt;br /&gt;
	logts(&amp;quot;Msg command was used by $from.\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !join #####&lt;br /&gt;
sub joinchan {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;join\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 5)) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;No channel was specified!&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$chan = substr($args, 5);&lt;br /&gt;
		snd(&amp;quot;JOIN $chan&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Joining $chan...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !part #####&lt;br /&gt;
sub partchan {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;part\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 5)) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;No channel was specified!&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$chan = substr($args, 5);&lt;br /&gt;
		snd(&amp;quot;PART $chan&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Parting $chan...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !nick #####&lt;br /&gt;
sub nick {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;nick\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 5)) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;No new nick was specified!&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$botnick = substr($args, 5);&lt;br /&gt;
		snd(&amp;quot;NICK $botnick&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Changed bot nick to $botnick...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !modchan #####&lt;br /&gt;
sub modchan {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;modchan\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
		if(!substr($args, 9)) {&lt;br /&gt;
		debug(&amp;quot;command was blank.\n&amp;quot;);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Current active channel is: $modchan&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$modchan = substr($args, 9);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Setting active channel to $modchan...&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Setting active channel to $modchan...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !bot #####&lt;br /&gt;
sub botswitch {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;bot\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if (!substr($args, 5)) {&lt;br /&gt;
		if($botstatus) {&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;Bot is enabled.&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;Bot is disabled.&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		$mode = substr($args, 5);&lt;br /&gt;
		if ($mode =~ /on/) {&lt;br /&gt;
			$botstatus = 1;&lt;br /&gt;
			msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Bot enabled.&amp;quot;);&lt;br /&gt;
			logts(&amp;quot;Bot enabled by $from...\n&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			if ($mode =~ /off/) {&lt;br /&gt;
				$botstatus = 0;&lt;br /&gt;
				msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Bot disabled.&amp;quot;);&lt;br /&gt;
				logts(&amp;quot;Bot disabled by $from...\n&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !loaded #####&lt;br /&gt;
sub loaded {&lt;br /&gt;
	snd(&amp;quot;NOTICE $from :Loaded modules: @modules&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !available ######&lt;br /&gt;
sub available {&lt;br /&gt;
	@available = &amp;lt;$moddir/*.pm&amp;gt;;&lt;br /&gt;
	my $i = 0;&lt;br /&gt;
	foreach $avail (@available) {&lt;br /&gt;
		my ($dir, $filename) = split(/\//, $avail);&lt;br /&gt;
		my ($modname, $ext) = split(/\./, $filename);&lt;br /&gt;
		$available[$i] = $modname;&lt;br /&gt;
		$i++;&lt;br /&gt;
	}&lt;br /&gt;
	snd(&amp;quot;NOTICE $from :Available modules: @available&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !load #####&lt;br /&gt;
sub loadmodule {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;load\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	my ($cmd,$module,@data) = split(/ /, $args);&lt;br /&gt;
 &lt;br /&gt;
	$i = 0;&lt;br /&gt;
	$found = 0;&lt;br /&gt;
	while($i &amp;lt;= @modules){&lt;br /&gt;
		if($modules[$i] eq $module){&lt;br /&gt;
			$found = 1;&lt;br /&gt;
		}&lt;br /&gt;
		$i++;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if( (-e &amp;quot;$moddir/$module.pm&amp;quot;) &amp;amp;&amp;amp; ( $found == 0 ) ) {&lt;br /&gt;
		my $retval = system( &amp;quot;perl -c $moddir/$module.pm&amp;quot; );&lt;br /&gt;
		if( $retval == 0 ) {&lt;br /&gt;
			load &amp;quot;$moddir/$module.pm&amp;quot;;&lt;br /&gt;
			push(@modules,$module);&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;Inserted: $module&amp;quot;);&lt;br /&gt;
			logts(&amp;quot;Module $module loaded by $from.\n&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;Could not load module: $module (Not valid Perl)&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if( $found == 1	) {&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;Could not load module: $module (Module is already loaded)&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;Could not load module: $module (Cannot find module)&amp;quot;);&lt;br /&gt;
		}					&lt;br /&gt;
	logts(&amp;quot;Module $module loaded by $from FAILED.\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### autoload modules #####&lt;br /&gt;
sub autoloadmodule {&lt;br /&gt;
	debug(&amp;quot;Attempting to load module $_[0].\n&amp;quot;);&lt;br /&gt;
	logts(&amp;quot;Loading module ....... &amp;quot;);&lt;br /&gt;
	$module = $_[0];&lt;br /&gt;
	&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	$found = 0;&lt;br /&gt;
	while($i &amp;lt;= @modules){&lt;br /&gt;
		if($modules[$i] eq $module){&lt;br /&gt;
			$found = 1;&lt;br /&gt;
		}&lt;br /&gt;
		$i++;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if( (-e &amp;quot;$moddir/$module.pm&amp;quot;) &amp;amp;&amp;amp; ( $found == 0 ) ) {&lt;br /&gt;
		my $retval = system( &amp;quot;perl -c $moddir/$module.pm 2&amp;gt; $moddir/temp&amp;quot; );&lt;br /&gt;
		unlink &amp;quot;$moddir/temp&amp;quot;;&lt;br /&gt;
		if( $retval == 0 ) {&lt;br /&gt;
			load &amp;quot;$moddir/$module.pm&amp;quot;;&lt;br /&gt;
			push(@modules,$module);&lt;br /&gt;
			logts(&amp;quot;[$module OK]\n&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			logts(&amp;quot;[$module FAILED] (not valid perl)\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		if( $found == 1	) {&lt;br /&gt;
			logts(&amp;quot;[$module FAILED] (already loaded)\n&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			logts(&amp;quot;[$module FAILED] (not found)\n&amp;quot;);&lt;br /&gt;
		}					&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !unload #####&lt;br /&gt;
sub unloadmodule {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;unload\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	my ($cmd,$module,@data) = split(/ /, $args);&lt;br /&gt;
 &lt;br /&gt;
	$i = 0;&lt;br /&gt;
	$found = 0;&lt;br /&gt;
	while($i &amp;lt;= @modules){&lt;br /&gt;
		if($modules[$i] eq $module){&lt;br /&gt;
			$found = 1;&lt;br /&gt;
			delete $INC{&amp;quot;$moddir/$module.pm&amp;quot;};&lt;br /&gt;
			delete $modules[$i];&lt;br /&gt;
			splice(@modules, $i ,1);&lt;br /&gt;
		}&lt;br /&gt;
	$i++;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	if( $found == 1 ) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Unloaded module: $module&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Module $module unloaded by $from.\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Could not unload module: $module (Module doesn&amp;#039;t appear to be loaded)&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Module $module unload by $from FAILED.\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !pubmods #####&lt;br /&gt;
sub pubmods {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;pubmods\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if (!substr($args, 9)) {&lt;br /&gt;
		if($botstatus) {&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;Public modules are enabled.&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			ntc(&amp;quot;$from&amp;quot;, &amp;quot;Public modules are disabled.&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		$mode = substr($args, 5);&lt;br /&gt;
		if ($mode =~ /on/) {&lt;br /&gt;
			$public_modules = 1;&lt;br /&gt;
			msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Public modules enabled.&amp;quot;);&lt;br /&gt;
			logts(&amp;quot;Public modules enabled by $from...\n&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			if ($mode =~ /off/) {&lt;br /&gt;
				$public_modules = 0;&lt;br /&gt;
				msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Pulbic modules disabled.&amp;quot;);&lt;br /&gt;
				logts(&amp;quot;Public modules disabled by $from...\n&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Public module commands #####&lt;br /&gt;
sub pubcmd {&lt;br /&gt;
	my($command, @data) = split(/ /,$args);&lt;br /&gt;
	$command = substr($command, 1);&lt;br /&gt;
	my($mod, $cmd) = split(/\./,$command);&lt;br /&gt;
 &lt;br /&gt;
	if(($mod =~ /^.+/) &amp;amp;&amp;amp; ($cmd =~ /^.+/)) {&lt;br /&gt;
		$i = 0;&lt;br /&gt;
		while($i &amp;lt;= @modules){&lt;br /&gt;
			if(($modules[$i] eq $mod) &amp;amp;&amp;amp; ( $mod-&amp;gt;can($cmd) )){&lt;br /&gt;
				if( $public_modules == 1) {&lt;br /&gt;
					$mod-&amp;gt;$cmd($from, $uname, $host, $from_chan, $modchan, $botnick, @data);&lt;br /&gt;
				} elsif( $mod-&amp;gt;can(&amp;#039;public&amp;#039;) ){&lt;br /&gt;
					@functions = $mod-&amp;gt;public();&lt;br /&gt;
					foreach $function (@functions) {&lt;br /&gt;
						if( ($function eq $cmd) ) {&lt;br /&gt;
							$mod-&amp;gt;$cmd($from, $uname, $host, $from_chan, $modchan, $botnick, @data);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}							&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	} elsif((($mod =~ /^.+/) &amp;amp;&amp;amp; ($cmd !~ /^.+/)) &amp;amp;&amp;amp; ( $mod-&amp;gt;can(&amp;#039;help&amp;#039;) )) {&lt;br /&gt;
		$mod-&amp;gt;help($from, $uname, $host, $from_chan, $modchan, $botnick, @data);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Admin module commands #####&lt;br /&gt;
sub admincmd {&lt;br /&gt;
	my($command, @data) = split(/ /,$args);&lt;br /&gt;
	$command = substr($command, 1);&lt;br /&gt;
	my($mod, $cmd) = split(/\./,$command);&lt;br /&gt;
 &lt;br /&gt;
	if(($mod =~ /^.+/) &amp;amp;&amp;amp; ($cmd =~ /^.+/)) {&lt;br /&gt;
		$i = 0;&lt;br /&gt;
		while($i &amp;lt;= @modules){&lt;br /&gt;
			if(($modules[$i] eq $mod) &amp;amp;&amp;amp; ( $mod-&amp;gt;can($cmd) )){&lt;br /&gt;
				if( $mod-&amp;gt;can(&amp;#039;public&amp;#039;) ) {&lt;br /&gt;
					@functions = $mod-&amp;gt;public();&lt;br /&gt;
					my $notPublic = 1;&lt;br /&gt;
					foreach $function (@functions) {&lt;br /&gt;
						if( ($function eq $cmd) ) {&lt;br /&gt;
							$notPublic = 0;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					if( $notPublic == 1 &amp;amp;&amp;amp; $public_modules == 0 ) {&lt;br /&gt;
						$mod-&amp;gt;$cmd($from, $uname, $host, $from_chan, $modchan, $botnick, @data);&lt;br /&gt;
					}&lt;br /&gt;
				} elsif ( $public_modules == 0) {&lt;br /&gt;
					$mod-&amp;gt;$cmd($from, $uname, $host, $from_chan, $modchan, $botnick, @data);&lt;br /&gt;
				}							&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !loadlist #####&lt;br /&gt;
sub loadlists {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;loadlist\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	debug(&amp;quot;Using data directory \&amp;quot;$datadir\&amp;quot;.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	open AOPLIST, &amp;quot;&amp;lt;$datadir/aop&amp;quot;;&lt;br /&gt;
	@aop = &amp;lt;AOPLIST&amp;gt;;&lt;br /&gt;
	close(AOPLIST);&lt;br /&gt;
	debug(&amp;quot;AOP list loaded.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	open AHOPLIST, &amp;quot;&amp;lt;$datadir/ahop&amp;quot;;&lt;br /&gt;
	@ahop = &amp;lt;AHOPLIST&amp;gt;;&lt;br /&gt;
	close(AHOPLIST);&lt;br /&gt;
	debug(&amp;quot;AHOP list loaded.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	open AVLIST, &amp;quot;&amp;lt;$datadir/av&amp;quot;;&lt;br /&gt;
	@av = &amp;lt;AVLIST&amp;gt;;&lt;br /&gt;
	close(AVLIST);&lt;br /&gt;
	debug(&amp;quot;AVOICE list loaded.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	open AKLIST, &amp;quot;&amp;lt;$datadir/ak&amp;quot;;&lt;br /&gt;
	@ak = &amp;lt;AKLIST&amp;gt;;&lt;br /&gt;
	close(AKLIST);&lt;br /&gt;
	debug(&amp;quot;AKICK list loaded.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Lists loaded.&amp;quot;);&lt;br /&gt;
	logts(&amp;quot;Loaded the lists...\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !add #####&lt;br /&gt;
sub add {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;add\&amp;quot;-command &amp;quot;);&lt;br /&gt;
	my ($msg,$type,$toadd) = split(/ /, $args);&lt;br /&gt;
	debug(&amp;quot;of type $type.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	if($type =~ /^op/) {&lt;br /&gt;
		open AOPLIST, &amp;quot;&amp;gt;&amp;gt;$datadir/aop&amp;quot;;&lt;br /&gt;
		print AOPLIST &amp;quot;$toadd\n&amp;quot;;&lt;br /&gt;
		close(AOPLIST);&lt;br /&gt;
		msg(&amp;quot;$modchan&amp;quot;, &amp;quot;$toadd added to auto-op list.&amp;quot;);&lt;br /&gt;
	} elsif($type =~ /^hop/) {&lt;br /&gt;
		open AHOPLIST, &amp;quot;&amp;gt;&amp;gt;$datadir/ahop&amp;quot;;&lt;br /&gt;
		print AHOPLIST &amp;quot;$toadd\n&amp;quot;;&lt;br /&gt;
		close(AHOPLIST);&lt;br /&gt;
		msg(&amp;quot;$modchan&amp;quot;, &amp;quot;$toadd added auto-half-op list..&amp;quot;);&lt;br /&gt;
	} elsif($type =~ /^voice/) {&lt;br /&gt;
		open AVLIST, &amp;quot;&amp;gt;&amp;gt;$datadir/av&amp;quot;;&lt;br /&gt;
		print AVLIST &amp;quot;$toadd\n&amp;quot;;&lt;br /&gt;
		close(AVLIST);&lt;br /&gt;
		ntc(&amp;quot;$modchan&amp;quot;, &amp;quot;$toadd added auto-voice list.&amp;quot;);&lt;br /&gt;
	} elsif($type =~ /^kick/) {&lt;br /&gt;
		open AKLIST, &amp;quot;&amp;gt;&amp;gt;$datadir/ak&amp;quot;;&lt;br /&gt;
		print AKLIST &amp;quot;$toadd\n&amp;quot;;&lt;br /&gt;
		close(AKLIST);&lt;br /&gt;
		ntc(&amp;quot;$modchan&amp;quot;, &amp;quot;$toadd added auto-kick list.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !op #####&lt;br /&gt;
sub oper {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;op\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 4)) {&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan +o $from&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Opered $from...\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$user = substr($args, 4);&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan +o $user&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Opered $user...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !deop #####&lt;br /&gt;
sub deoper {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;deop\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 6)) {&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan -o $from&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Deopered $from...\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$user = substr($args, 6);&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan -o $user&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Deopered $user...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !hop #####&lt;br /&gt;
sub halfoper{&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;hop\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 5)) {&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan +h $from&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Half-opered $from...\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$user = substr($args, 5);&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan +h $user&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Half-opered $user...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !dehop #####&lt;br /&gt;
sub dehalfoper {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;dehop\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 7)) {&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan -h $from&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Dehalf-opered $from...\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$user = substr($args, 7);&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan -h $user&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Dehalf-opered $user...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !voice #####&lt;br /&gt;
sub voice {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;voice\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 6)) {&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan +v $from&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Voiced $from...\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$user = substr($args, 6);&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan +v $user&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Voiced $user...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !devoice #####&lt;br /&gt;
sub devoice {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;devoice\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 8)) {&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan -v $from&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Devoiced $from...\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$user = substr($args, 8);&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan -v $user&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Devoiced $user...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !all #####&lt;br /&gt;
sub all {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;all\&amp;quot;-command &amp;quot;);&lt;br /&gt;
	my ($msg,$type) = split(/ /, $args);&lt;br /&gt;
	debug(&amp;quot;of type $type.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	if($type =~ /^op/) {&lt;br /&gt;
		msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Global Oper for $modchan users enabled.&amp;quot;);&lt;br /&gt;
		$op_all = 1;&lt;br /&gt;
		logts(&amp;quot;Enabled Op all on $modchan by $from.\n&amp;quot;);&lt;br /&gt;
	} elsif($type =~ /^hop/) {&lt;br /&gt;
		msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Global Half-op for $modchan users enabled.&amp;quot;);&lt;br /&gt;
		$hop_all = 1;&lt;br /&gt;
		logts(&amp;quot;Enabled Half-Op all on $modchan by $from.\n&amp;quot;);&lt;br /&gt;
	} elsif($type =~ /^voice/) {&lt;br /&gt;
		msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Global Voice for $modchan users enabled.&amp;quot;);&lt;br /&gt;
		$voice_all = 1;&lt;br /&gt;
		logts(&amp;quot;Enabled Voice all on $modchan by $from.\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !none #####&lt;br /&gt;
sub none {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;none\&amp;quot;-command &amp;quot;);&lt;br /&gt;
	my ($msg,$type) = split(/ /, $args);&lt;br /&gt;
	debug(&amp;quot;of type $type.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	if($type =~ /^op/) {&lt;br /&gt;
		msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Global Oper for $modchan users disabled.&amp;quot;);&lt;br /&gt;
		$op_all = 0;&lt;br /&gt;
		logts(&amp;quot;Enabled Op all on $modchan by $from.\n&amp;quot;);&lt;br /&gt;
	} elsif($type =~ /^hop/) {&lt;br /&gt;
		msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Global Half-op for $modchan users disabled.&amp;quot;);&lt;br /&gt;
		$hop_all = 0;&lt;br /&gt;
		logts(&amp;quot;Enabled Half-Op all on $modchan by $from.\n&amp;quot;);&lt;br /&gt;
	}  elsif($type =~ /^voice/) {&lt;br /&gt;
		msg(&amp;quot;$modchan&amp;quot;, &amp;quot;Global Voice for $modchan users disabled.&amp;quot;);&lt;br /&gt;
		$voice_all = 0;&lt;br /&gt;
		logts(&amp;quot;Enabled Voice all on $modchan by $from.\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !kick #####&lt;br /&gt;
sub kick {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;kick\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 5)) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Commmand requires username to kick.&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$user = substr($args, 5);&lt;br /&gt;
   	 	snd(&amp;quot;KICK $from_chan $user (Requested.)&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Kicked $user...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !ban #####&lt;br /&gt;
sub ban {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;ban\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 5)) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Command requires something to ban.&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$hostmask = substr($args, 5);&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan +b $hostmask&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Banned $hostmask...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !unban #####&lt;br /&gt;
sub unban {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;unban\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 7)) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Command requires hostname to unban.&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$hostmask = substr($args, 7);&lt;br /&gt;
		snd(&amp;quot;MODE $from_chan -b $hostmask&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Unanned $hostmask...\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !topic #####&lt;br /&gt;
sub topic {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;topic\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 7)) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;No new topic specified.&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$new_topic = substr($args, 7);&lt;br /&gt;
		snd(&amp;quot;TOPIC $from_chan :$new_topic&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Set topic for $from_chan set to $new_topic\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !mode #####&lt;br /&gt;
sub mode {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;mode\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	if(!substr($args, 6)) {&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;No arguments specified.&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		$modes = substr($args, 6);&lt;br /&gt;
		snd(&amp;quot;MODE $modes&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Set modes $modes\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !admin #####&lt;br /&gt;
sub admin {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;admin\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	my ($msg,$type,$hostm) = split(/ /, $args);&lt;br /&gt;
 &lt;br /&gt;
	if ($type =~ /add/) {&lt;br /&gt;
		push(@opers,$hostm);&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Added $hostm to temp admin list.&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Added temp admin $hostm by $from\n&amp;quot;);&lt;br /&gt;
		debug(&amp;quot;Oper list: &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
		foreach $oper (@opers) { &lt;br /&gt;
			debug(&amp;quot;$oper &amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		debug(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	} elsif ($type =~ /del/) {&lt;br /&gt;
		$i = 0;&lt;br /&gt;
		while($i &amp;lt;= @opers){&lt;br /&gt;
			if($opers[$i] eq $hostm){&lt;br /&gt;
				while($i &amp;lt; @opers){&lt;br /&gt;
					$opers[$i] = $opers[$i+1];&lt;br /&gt;
					$i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
		ntc(&amp;quot;$from&amp;quot;, &amp;quot;Removed $hostm from temp admin list.&amp;quot;);&lt;br /&gt;
		logts(&amp;quot;Removed temp admin $hostm by $from\n&amp;quot;);&lt;br /&gt;
		debug(&amp;quot;Oper list: &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
		foreach $oper (@opers) { &lt;br /&gt;
			debug(&amp;quot;$oper &amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	debug(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	} else {&lt;br /&gt;
		snd(&amp;quot;NOTICE $from :Current admins: @opers&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### !quit #####&lt;br /&gt;
sub botquit {&lt;br /&gt;
	debug(&amp;quot;Received \&amp;quot;quit\&amp;quot;-command.\n&amp;quot;);&lt;br /&gt;
	logts(&amp;quot;Quit command was issued by $from.\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	my ($cmd,@msg) = split(/ /, $args);&lt;br /&gt;
 &lt;br /&gt;
	if($msg[0] eq &amp;quot;&amp;quot;) {&lt;br /&gt;
		snd(&amp;quot;QUIT $botnick was instructed to quit.&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		snd(&amp;quot;QUIT @msg&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	close($sock);&lt;br /&gt;
	&amp;amp;shutd;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
##### Process exit subroutine #####&lt;br /&gt;
sub shutd {&lt;br /&gt;
	logts(&amp;quot;Shutting down.\n&amp;quot;);&lt;br /&gt;
	debug(&amp;quot;Final line of code before exit call.\n&amp;quot;);&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Wikiadmin</name></author>
	</entry>
</feed>