<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://script.quakenet.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Login_and_user_system</id>
	<title>Login and user system - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://script.quakenet.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Login_and_user_system"/>
	<link rel="alternate" type="text/html" href="https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;action=history"/>
	<updated>2026-05-24T23:40:58Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=4630&amp;oldid=prev</id>
		<title>Cail: eeeeeek!</title>
		<link rel="alternate" type="text/html" href="https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=4630&amp;oldid=prev"/>
		<updated>2008-01-21T15:08:06Z</updated>

		<summary type="html">&lt;p&gt;eeeeeek!&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 15:08, 21 January 2008&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-l241&quot;&gt;Line 241:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 241:&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;   echo -ag Removed user $1&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;   echo -ag Removed user $1&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;   return Removed user $1&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;   return Removed user $1&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; &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; &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;div&gt;   ; again, we made changes to the users-table, save it&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;   ; again, we made changes to the users-table, save it&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;   hsave users users.hsh&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;   hsave users users.hsh&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Cail</name></author>
	</entry>
	<entry>
		<id>https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2335&amp;oldid=prev</id>
		<title>Cail: added hsave to deluser alias</title>
		<link rel="alternate" type="text/html" href="https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2335&amp;oldid=prev"/>
		<updated>2007-07-19T15:53:47Z</updated>

		<summary type="html">&lt;p&gt;added hsave to deluser alias&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 15:53, 19 July 2007&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-l241&quot;&gt;Line 241:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 241:&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;   echo -ag Removed user $1&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;   echo -ag Removed user $1&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;   return Removed user $1&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;   return Removed user $1&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;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 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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  ; again, we made changes to the users-table, save it&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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  hsave users users.hsh&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;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;&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;/table&gt;</summary>
		<author><name>Cail</name></author>
	</entry>
	<entry>
		<id>https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2304&amp;oldid=prev</id>
		<title>Shenghi: Removed ; for the sake of uniqueness &lt;3</title>
		<link rel="alternate" type="text/html" href="https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2304&amp;oldid=prev"/>
		<updated>2007-07-11T12:26:00Z</updated>

		<summary type="html">&lt;p&gt;Removed ; for the sake of uniqueness &amp;lt;3&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 12:26, 11 July 2007&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-l31&quot;&gt;Line 31:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 31:&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;  ;; Usersystem with accesslevels and user control.&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;  ;; Usersystem with accesslevels and user control.&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;  ;; Contact: Cail @ QuakeNet -&amp;gt; #help.script&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;  ;; Contact: Cail @ QuakeNet -&amp;gt; #help.script&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;  &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;;&lt;/del&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;/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;&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;  alias loadusers {&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;  alias loadusers {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Shenghi</name></author>
	</entry>
	<entry>
		<id>https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2301&amp;oldid=prev</id>
		<title>Cail: added note about usage of identifiers</title>
		<link rel="alternate" type="text/html" href="https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2301&amp;oldid=prev"/>
		<updated>2007-07-11T10:33:05Z</updated>

		<summary type="html">&lt;p&gt;added note about usage of identifiers&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 10:33, 11 July 2007&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-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&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;* /edituser = edits users information (/edituser &amp;lt;-pass|-username|-addlevel|-remlevel|-help&amp;gt; &amp;lt;username&amp;gt; &amp;lt;parameters&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;* /edituser = edits users information (/edituser &amp;lt;-pass|-username|-addlevel|-remlevel|-help&amp;gt; &amp;lt;username&amp;gt; &amp;lt;parameters&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;* /logoutusers = logs out all users from a given channel (/logoutusers #chan, used when you part/get kicked)&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;* /logoutusers = logs out all users from a given channel (/logoutusers #chan, used when you part/get kicked)&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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;$adduser, $deluser and $edituser aliases can be used as an identifier, they return the message whether command was succesfull, or errormessage if input wasn&#039;t correct&#039;&#039;&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;Identifiers:&amp;lt;br /&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;Identifiers:&amp;lt;br /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Cail</name></author>
	</entry>
	<entry>
		<id>https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2300&amp;oldid=prev</id>
		<title>Cail: changed text a bit</title>
		<link rel="alternate" type="text/html" href="https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2300&amp;oldid=prev"/>
		<updated>2007-07-11T08:11:13Z</updated>

		<summary type="html">&lt;p&gt;changed text a bit&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 08:11, 11 July 2007&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-l25&quot;&gt;Line 25:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 25:&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;If you wish to use named levels, like Master, Owner, etc. you&amp;#039;ll need to add those levels with corresponding numbered level into the &amp;#039;&amp;#039;&amp;#039;cuser&amp;#039;&amp;#039;&amp;#039; alias, see the source for more info.&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;If you wish to use named levels, like Master, Owner, etc. you&amp;#039;ll need to add those levels with corresponding numbered level into the &amp;#039;&amp;#039;&amp;#039;cuser&amp;#039;&amp;#039;&amp;#039; alias, see the source for more info.&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; 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;I added events for user control &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;via query &lt;/del&gt;to the examples part, so you can add the script to your bot and use the commands via query.&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;I added events for user control to the examples part, so you can add the script to your bot and use the commands via query&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/channel with !command&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;  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&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;/table&gt;</summary>
		<author><name>Cail</name></author>
	</entry>
	<entry>
		<id>https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2299&amp;oldid=prev</id>
		<title>Cail: added category</title>
		<link rel="alternate" type="text/html" href="https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2299&amp;oldid=prev"/>
		<updated>2007-07-11T08:03:54Z</updated>

		<summary type="html">&lt;p&gt;added category&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 08:03, 11 July 2007&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-l373&quot;&gt;Line 373:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 373:&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;   else { .notice $nick You need to login to use this command. }&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;   else { .notice $nick You need to login to use this command. }&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 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;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 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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Script_Archive]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Cail</name></author>
	</entry>
	<entry>
		<id>https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2298&amp;oldid=prev</id>
		<title>Cail: Added page.</title>
		<link rel="alternate" type="text/html" href="https://script.quakenet.org/wiki/index.php?title=Login_and_user_system&amp;diff=2298&amp;oldid=prev"/>
		<updated>2007-07-11T07:59:53Z</updated>

		<summary type="html">&lt;p&gt;Added page.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;A user system with accesslevels and user control.&amp;lt;br /&amp;gt;&lt;br /&gt;
The main idea of this script is to identify users through a login, not like mirc&amp;#039;s default accesslevels, by nick/ident/host or some of those combinations.&amp;lt;br /&amp;gt;&lt;br /&gt;
Here it doesn&amp;#039;t matter what nick/ident/host the user has, he just logs into the bot.&lt;br /&gt;
&lt;br /&gt;
Commands:&amp;lt;br /&amp;gt;&lt;br /&gt;
* /loadusers = makes the users and login tables, and loads saved user information.&lt;br /&gt;
* /saveusers = saves user information to users.hsh and frees users and login tables.&lt;br /&gt;
* /adduser = adds a new user (/adduser &amp;lt;username&amp;gt; &amp;lt;password&amp;gt;&lt;br /&gt;
* /deluser = deletes an existing user /deluser &amp;lt;username&amp;gt;)&lt;br /&gt;
* /userlist = gives you a list of users (/userlist &amp;lt;-all|-active&amp;gt; -all = all of the users, -active = list only logged in users)&lt;br /&gt;
* /edituser = edits users information (/edituser &amp;lt;-pass|-username|-addlevel|-remlevel|-help&amp;gt; &amp;lt;username&amp;gt; &amp;lt;parameters&amp;gt;)&lt;br /&gt;
* /logoutusers = logs out all users from a given channel (/logoutusers #chan, used when you part/get kicked)&lt;br /&gt;
&lt;br /&gt;
Identifiers:&amp;lt;br /&amp;gt;&lt;br /&gt;
* $checklevel = checks if the user has sufficient accesslevel, returns $true/$false ($checklevel($address,$chan,master))&lt;br /&gt;
* $getlevel = return the users level, numbered/named ($getlevel($address,$chan|Global))&lt;br /&gt;
* $getuser = returns username by given address ($getuser($address))&lt;br /&gt;
&lt;br /&gt;
A little more explanation on how this works:&amp;lt;br /&amp;gt;&lt;br /&gt;
The user can have an acceslevels on a channel, and a global accesslevel, when checking for a level on certain channel, and it&amp;#039;s insufficient, then the global level is checked.&amp;lt;br /&amp;gt;&lt;br /&gt;
ie. you have a command !op, which requires atleast level 10 to use it, $checklevel($address,$chan,10) is then used, if the user has accesslevel of 5 on that channel, but he has a Global level of 15, he can use the command.&amp;lt;br /&amp;gt;&lt;br /&gt;
You can also check only for a global level by doing $checklevel($address,global,10), and if you only want to know, if the user is logged in, you can use $checklevel($address).&lt;br /&gt;
&lt;br /&gt;
If you want to compare the exact level of the user, use $getlevel($address,$chan) ($chan or &amp;quot;global&amp;quot;) in an if like: if ($getlevel($address,$chan) == Master) { notice $nick yes, you are a master on $chan }&amp;lt;br /&amp;gt;&lt;br /&gt;
If you wish to use named levels, like Master, Owner, etc. you&amp;#039;ll need to add those levels with corresponding numbered level into the &amp;#039;&amp;#039;&amp;#039;cuser&amp;#039;&amp;#039;&amp;#039; alias, see the source for more info.&lt;br /&gt;
&lt;br /&gt;
I added events for user control via query to the examples part, so you can add the script to your bot and use the commands via query.&lt;br /&gt;
&lt;br /&gt;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
 ;; Usersystem with accesslevels and user control.&lt;br /&gt;
 ;; Contact: Cail @ QuakeNet -&amp;gt; #help.script&lt;br /&gt;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
 &lt;br /&gt;
 alias loadusers {&lt;br /&gt;
  ; check if &amp;#039;users&amp;#039; and &amp;#039;login&amp;#039; tables already exist, if not, create them&lt;br /&gt;
  if (!$hget(users)) { hmake users 100 }&lt;br /&gt;
  if (!$hget(login)) { hmake login 100 }&lt;br /&gt;
 &lt;br /&gt;
  ; check if there is a file &amp;#039;users.hsh&amp;#039; (saved user information), if we have it, empty users-table and load the saved info&lt;br /&gt;
  if ($is_file(users.hsh)) { hdel -w users * | hload users users.hsh }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias saveusers {&lt;br /&gt;
  ; check if &amp;#039;users&amp;#039; and &amp;#039;login&amp;#039; tables even exist, if so, they can be saved and freed&lt;br /&gt;
  if ($hget(users)) { hsave users users.hsh | .hfree users }&lt;br /&gt;
  if ($hget(login)) { hfree login }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias -l logoutusers {&lt;br /&gt;
  ; loop through a given channel ($1 = channel) and logout everyone who is logged in&lt;br /&gt;
 &lt;br /&gt;
  var %x = 1 &lt;br /&gt;
  while ($nick($1,%x)) { &lt;br /&gt;
    var %addr = $v1 &lt;br /&gt;
 &lt;br /&gt;
    ; check the login table for a matching address with $ial().addr, and if he&amp;#039;s not on any other same channels as you&lt;br /&gt;
    if ($hget(login,$ial(%addr).addr)) &amp;amp;&amp;amp; (!$comchan(%addr,2)) { hdel login %addr } &lt;br /&gt;
    inc %x &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias cuser {&lt;br /&gt;
  ; return corresponding accesslevel for named levels, needed for comparison&lt;br /&gt;
 &lt;br /&gt;
  if ($1 == owner) { return 200 }&lt;br /&gt;
  elseif ($1 == master) { return 150 }&lt;br /&gt;
  elseif ($1 == test) { return 100 }&lt;br /&gt;
  else { return $1 }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias checklevel {&lt;br /&gt;
  ; if $2 (&amp;#039;#channel&amp;#039; or &amp;#039;global&amp;#039;) isn&amp;#039;t given, check if the user is logged in&lt;br /&gt;
  if (!$2) { return $iif($hget(login,$1),$true,$false) }&lt;br /&gt;
 &lt;br /&gt;
  ; fetch the username to %user from the login table by $1 (given address),&lt;br /&gt;
  ; %lvl_chan and %lvl_global will get their values from the users-table, converted to a numeric with $cuser&lt;br /&gt;
  ; $iif gives them value 0 if they don&amp;#039;t exist (comparison won&amp;#039;t work with $null)&lt;br /&gt;
  var %user = $hget(login,$1)&lt;br /&gt;
  var %lvl_chan = $iif($cuser($hget(users,$+(%user,$chr(7),$2))),$v1,0)&lt;br /&gt;
  var %lvl_global = $iif($cuser($hget(users,$+(%user,$chr(7),global))),$v1,0)&lt;br /&gt;
 &lt;br /&gt;
  ; inner $iif checks which one is greater, channel level or global level, and compares it to given level ($3)&lt;br /&gt;
  return $iif($iif(%lvl_global &amp;gt; %lvl_chan,%lvl_global,%lvl_chan) &amp;gt;= $cuser($3),$true,$false)&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias getlevel {&lt;br /&gt;
  ; return the named level by given address&lt;br /&gt;
  return $hget(users,$+($hget(login,$1),$chr(7),$2))&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias getuser { &lt;br /&gt;
  ; return username by given address&lt;br /&gt;
  return $hget(login,$1) &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias adduser {&lt;br /&gt;
  ; errorchecking&lt;br /&gt;
  ; check if the users-table exist&lt;br /&gt;
  if (!$hget(users)) { var %error = You need to load the usertable first: /loadusers }&lt;br /&gt;
  ; check if there&amp;#039;s enough parameters&lt;br /&gt;
  if (!$2) { var %error = Insufficient parameters, usage: /adduser &amp;lt;username&amp;gt; &amp;lt;password&amp;gt; }&lt;br /&gt;
  ; check if given username doesn&amp;#039;t exist&lt;br /&gt;
  if ($hget(users,$1)) { var %error = That username is already taken! }&lt;br /&gt;
  ; validate the username and password&lt;br /&gt;
  if (!$regex($+($1,$2),/^([][A-Za-z\\^`{|}-][][\w\\^`{|}-]*)$/)) { var %error = Incorrect username. }&lt;br /&gt;
 &lt;br /&gt;
  ; if we encountered an error return the error msg or echo it, depending of if it was called as an identifier or not&lt;br /&gt;
  ; else say that everything&amp;#039;s fine&lt;br /&gt;
  if (%error) { echo -ag %error | return %error } &lt;br /&gt;
 &lt;br /&gt;
  ; everything was fine if we got here, add the user into users table and save the table&lt;br /&gt;
  hadd users $1 $2&lt;br /&gt;
  hsave users users.hsh &lt;br /&gt;
  echo -ag User $1 added.&lt;br /&gt;
  return User $1 added.&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias edituser {&lt;br /&gt;
  ; errorchecking&lt;br /&gt;
  ; check if valid parameters are given ($1 = switch, $2 = username, $3- = parameters)&lt;br /&gt;
  if (!$istok(-pass -addlevel -remlevel -username -help,$1,32)) || (!$3) { &lt;br /&gt;
    var %error Usage: /edituser &amp;lt;-pass|-addlevel|-remlevel|-username|-help&amp;gt; &amp;lt;username&amp;gt; &amp;lt;parameters&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
  ; check if the user exists&lt;br /&gt;
  elseif (!$hget(users,$2)) { var %error No such user. }&lt;br /&gt;
 &lt;br /&gt;
  ; echo/return errors if any, else carry on&lt;br /&gt;
  if (%error) { echo -ag %error | return %error }&lt;br /&gt;
 &lt;br /&gt;
  ; get the address from the login-table, and check if the address is found from IAL, if so, we can msg the user with the changes made&lt;br /&gt;
  var %nick = $ial($+(*,$hfind(login,$2,1).data),1).nick&lt;br /&gt;
 &lt;br /&gt;
  ; -pass: changes the users password&lt;br /&gt;
  if ($1 == -pass) {&lt;br /&gt;
    ; check the validity of the password&lt;br /&gt;
    if (!$regex($3,/^([][A-Za-z\\^`{|}-][][\w\\^`{|}-]*)$/)) { var %error Incorrect password. }&lt;br /&gt;
 &lt;br /&gt;
    ; check for errors&lt;br /&gt;
    if (%error) { echo -ag %error | return %error }&lt;br /&gt;
 &lt;br /&gt;
    ; everything&amp;#039;s fine, add the new password to the users table, echo, and msg %nick (if found)&lt;br /&gt;
    hadd users $2 $3 &lt;br /&gt;
    if (%nick) { .notice $v1 Your password has been changed to $3 }&lt;br /&gt;
    echo -ag Changed $2 $+ &amp;#039;s password to $3 &lt;br /&gt;
    return Changed $2 $+ &amp;#039;s password to $3&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  ; -addlevel: add access level to user, for #channel or Global&lt;br /&gt;
  elseif ($1 == -addlevel) {&lt;br /&gt;
    ; here we have more parameters, so we need to check that there is $4&lt;br /&gt;
    if ($4 == $null) { var %error Usage: /edituser -addlevel username #channel|global accesslevel }&lt;br /&gt;
 &lt;br /&gt;
    ; check for errors&lt;br /&gt;
    if (%error) { echo -ag %error | return %error }&lt;br /&gt;
 &lt;br /&gt;
    ; add a new item into users-table (username7#channel) that 7 in there is $chr(7), we use it to separate username and channel in the item name&lt;br /&gt;
    ; then again echo and msg %nick if possible&lt;br /&gt;
    hadd users $+($2,$chr(7),$3) $4&lt;br /&gt;
    if (%nick) { .notice $v1 Your $3 accesslevel has been changed to $4 $+ . }&lt;br /&gt;
    echo -ag Changed $2 $+ &amp;#039;s level to &amp;gt; $3 $+ : $4&lt;br /&gt;
    return Changed $2 $+ &amp;#039;s level to &amp;gt; $3 $+ : $4&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  ; -remlevel: remove a users level&lt;br /&gt;
  elseif ($1 == -remlevel) {&lt;br /&gt;
    ; check that the user has accesslevels in $3 (given channel/Global)&lt;br /&gt;
    if (!$hget(users,$+($2,$chr(7),$3))) { var %error = User $2 doesn&amp;#039;t have accesslevel in $3 }&lt;br /&gt;
 &lt;br /&gt;
    ; check for errors&lt;br /&gt;
    if (%error) { echo -ag %error | return %error }&lt;br /&gt;
 &lt;br /&gt;
    ; hdel the item from users-table, echo, and msg %nick if possible&lt;br /&gt;
    hdel users $+($2,$chr(7),$3) &lt;br /&gt;
    if (%nick) { .notice $v1 Your accesslevel in $3 has been removed. }&lt;br /&gt;
    echo -ag Removed $2 $+ &amp;#039;s accesslevel from $3&lt;br /&gt;
    return Removed $2 $+ &amp;#039;s accesslevel from $3&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  ; -username: change the username of someone (this is case-insensitive, so you cannot change ie. Cail -&amp;gt; cail)&lt;br /&gt;
  elseif ($1 == -username) {&lt;br /&gt;
    ; check that the new username isn&amp;#039;t already taken, and validate the new username&lt;br /&gt;
    if ($hget(users,$3)) { var %error = That username is already taken! }&lt;br /&gt;
    if (!$regex($3,/^([][A-Za-z\\^`{|}-][][\w\\^`{|}-]*)$/)) { var %error = Incorrect username. }&lt;br /&gt;
 &lt;br /&gt;
    ; check for errors&lt;br /&gt;
    if (%error) { echo -ag %error | return %error }&lt;br /&gt;
 &lt;br /&gt;
    ; we need to store the address to a variables, &amp;#039;cause we will be deleting the old item from the login-table&lt;br /&gt;
    var %pass = $hget(users,$2)&lt;br /&gt;
    var %address = $hfind(login,$2,1).data&lt;br /&gt;
 &lt;br /&gt;
    ; add the new username with the old password, and delete the old item&lt;br /&gt;
    hadd users $3 $hget(users,$2)&lt;br /&gt;
    hdel users $2 &lt;br /&gt;
 &lt;br /&gt;
    ; update all the access levels for the new username, %y = the number of accesslevel items&lt;br /&gt;
    var %y = $hfind(users,$+($2,$chr(7),*),0,w)&lt;br /&gt;
    while (%y) {&lt;br /&gt;
      ; use $hfind to get the old item name&lt;br /&gt;
      var %item = $hfind(users,$+($2,$chr(7),*),%y,w)&lt;br /&gt;
 &lt;br /&gt;
      ; add the new itemname with the old value, and delete the old item&lt;br /&gt;
      hadd users $+($3,$chr(7),$gettok(%item,2-,7)) $hget(users,%item)&lt;br /&gt;
      hdel users %item&lt;br /&gt;
      dec %y&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    ; change the username in the login-table, if the user is logged in, and msg him with the changes&lt;br /&gt;
    if (%address) { hadd login %address $3 }&lt;br /&gt;
    if (%nick) { .notice $v1 Your username has been changed to $3 $+ . }&lt;br /&gt;
    echo -ag Changed $2 $+ &amp;#039;s username to $3&lt;br /&gt;
    return Changed $2 $+ &amp;#039;s username to $3&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  ; -help: echo the syntax of /edituser&lt;br /&gt;
  elseif ($1 == -help) {&lt;br /&gt;
    echo -ag -pass -&amp;gt; /edituser -pass &amp;lt;username&amp;gt; &amp;lt;new_password&amp;gt;&lt;br /&gt;
    echo -ag -addlevel -&amp;gt; /edituser -addlevel &amp;lt;username&amp;gt; &amp;lt;#channel|global&amp;gt; &amp;lt;level&amp;gt;&lt;br /&gt;
    echo -ag -remlevel -&amp;gt; /edituser -remlevel &amp;lt;username&amp;gt; &amp;lt;#channel|global&amp;gt;&lt;br /&gt;
    echo -ag -username -&amp;gt; /edituser -username &amp;lt;username&amp;gt; &amp;lt;new_username&amp;gt;&lt;br /&gt;
    echo -ag If level is a named level, make sure you have added it into the cuser -alias.&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  ; we have made some changes to the users-table, save it now&lt;br /&gt;
  hsave users users.hsh&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias deluser {&lt;br /&gt;
  ; check that given username exists&lt;br /&gt;
  if (!$hget(users,$1)) { var %error No such user. }&lt;br /&gt;
 &lt;br /&gt;
  ; check for errors&lt;br /&gt;
  if (%error) { echo -ag %error | return %error }&lt;br /&gt;
 &lt;br /&gt;
  ; delete the username from the userstable and remove all of his accesslevels, and echo the progress&lt;br /&gt;
  ; and if he is logged in, remove him from the login-table&lt;br /&gt;
  hdel users $1&lt;br /&gt;
  hdel -w users $+($1,$chr(7),*)&lt;br /&gt;
  if ($hfind(login,12,1).data) { hdel login $v1 }&lt;br /&gt;
  echo -ag Removed user $1&lt;br /&gt;
  return Removed user $1&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 alias userlist {&lt;br /&gt;
  ; check that given input is correct&lt;br /&gt;
  if (!$istok(-all -active,$1,32)) { echo -ag Usage: /userlist &amp;lt;-all|-active&amp;gt; | return }&lt;br /&gt;
 &lt;br /&gt;
  ; make variable %active $true/$false depending on if we&amp;#039;re looking for active users&lt;br /&gt;
  var %active = $iif($1 == -active,$true,$false)&lt;br /&gt;
 &lt;br /&gt;
  ; echo an empty line and &amp;quot;listing blaa blaa&amp;quot;&lt;br /&gt;
  echo -ag $chr(160)&lt;br /&gt;
  echo -ag --- Listing $remove($1,-) users:&lt;br /&gt;
 &lt;br /&gt;
  ; the regular expression in the $hfind finds all the items, that doesn&amp;#039;t have $chr(7) in the itemname (we don&amp;#039;t want to mix accesslevel items with username items)&lt;br /&gt;
  var %x = 1 &lt;br /&gt;
  while ($hfind(users,/^[^\x07]+$/i,%x,r)) { &lt;br /&gt;
    ; put the username into a variable, if the user is logged in, %address will hold his address, assign %levels variable to $null at the start&lt;br /&gt;
    var %user = $v1&lt;br /&gt;
    var %address = $hfind(login,%user,1).data&lt;br /&gt;
    var %levels = $null&lt;br /&gt;
 &lt;br /&gt;
    ; if we are looking for active users %active will now be $true, and if there&amp;#039;s no %address, the user isn&amp;#039;t logged in, so /continue and keep looking for users&lt;br /&gt;
    if (%active) &amp;amp;&amp;amp; (!%address) { inc %x | continue }&lt;br /&gt;
 &lt;br /&gt;
    ; echo username and address/&amp;quot;not logged&amp;quot;, $base() here will zero-pad the number (2 becomes 02, looks better)&lt;br /&gt;
    echo -ag $chr(31) $+ $base(%x,10,10,2) $+ : %user ( $+ $iif(%address,%address,not logged) $+ ) $chr(31) &lt;br /&gt;
 &lt;br /&gt;
    ; now that we have a user, loop through all of his accesslevels (now we want to find everyitem starting with username7, where the 7 is again $chr(7))&lt;br /&gt;
    var %y = 1&lt;br /&gt;
    while ($hfind(users,$+(%user,$chr(7),*),%y,w)) {&lt;br /&gt;
      ; put the levels into %levels variable, so we can echo all of them on one line (we&amp;#039;&amp;#039;ll put $chr(7) here to separate the &amp;quot;#channel: level&amp;quot; from &amp;quot;#channel2: level2&amp;quot; so we can sort them later)&lt;br /&gt;
      var %levels = $gettok($v1,2-,7) $+ : $hget(users,$v1) $+ $chr(7) $+ %levels&lt;br /&gt;
      inc %y&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    ; so we have all the levels the user has in %levels, now $sorttok so we get the Global-level first, and replace that $chr(7) with spaces and -&lt;br /&gt;
    ; we would get a line like: Global: Master - #channel: Owner etc.&lt;br /&gt;
    echo -ag $str($chr(160),3) Levels: $replace($sorttok(%levels,7,r),$chr(7),$+($chr(32),-,$chr(32)))&lt;br /&gt;
    inc %x &lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  ; echo &amp;quot;end of&amp;quot; and an empty line&lt;br /&gt;
  echo -ag --- End of users.&lt;br /&gt;
  echo -ag $chr(160)&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ; EVENTS&lt;br /&gt;
 &lt;br /&gt;
 on *:start:{ loadusers }&lt;br /&gt;
 on *:exit:{ saveusers }&lt;br /&gt;
 &lt;br /&gt;
 on !*:quit:{ &lt;br /&gt;
  ; if the user that quit, was logged in, remove him from the login table&lt;br /&gt;
  if ($hget(login,$address)) { hdel login $address } &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 on *:part:#:{ &lt;br /&gt;
  ; if it is you, who parts the channel, logout everyone in that channel (if they&amp;#039;re not on some other channels, where you are)&lt;br /&gt;
  ; else check if the user that quit, is logged in (and is not on any other chans with you), log him out&lt;br /&gt;
 &lt;br /&gt;
  if ($nick == $me) { logoutusers # }&lt;br /&gt;
  elseif ($hget(login,$address)) &amp;amp;&amp;amp; (!$comchan($nick,2)) { hdel login $address } &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 on *:kick:#:{ &lt;br /&gt;
  ; if it is you, who got kicked, logout everyone in that channel (if they&amp;#039;re not on some other channels, where you are)&lt;br /&gt;
  ; else check if the user that got kicked, is logged in (and is not on any other chans with you), log him out&lt;br /&gt;
 &lt;br /&gt;
  if ($knick == $me) { logoutusers # }&lt;br /&gt;
  elseif ($hget(login,$address)) &amp;amp;&amp;amp; (!$comchan($knick,2)) { hdel login $address } &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 on ^*:open:?:login &amp;amp; &amp;amp;:{&lt;br /&gt;
  ; check if user is already logged in, if so, tell him that&lt;br /&gt;
  if ($hget(login,$address)) {&lt;br /&gt;
    .notice $nick You are already logged in!&lt;br /&gt;
  }&lt;br /&gt;
  ; check that the user is on atleast one channel with you&lt;br /&gt;
  elseif (!$comchan($nick,0)) { &lt;br /&gt;
    .notice $nick You need to be on atleast one same channel as i am to login. &lt;br /&gt;
  }&lt;br /&gt;
  ; if the login information is correct (check that item $2 has the right password $3), add the user into login-table&lt;br /&gt;
  elseif ($hget(users,$2) == $3) {&lt;br /&gt;
    .notice $nick succesfully logged in&lt;br /&gt;
    hadd login $address $2&lt;br /&gt;
  }&lt;br /&gt;
  ; else the login information is incorrect&lt;br /&gt;
  else { &lt;br /&gt;
    .notice $nick Wrong username/password.&lt;br /&gt;
  }&lt;br /&gt;
  haltdef&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Exaples of usage ==&lt;br /&gt;
&lt;br /&gt;
 on *:text:!adduser &amp;amp; &amp;amp;:*:{&lt;br /&gt;
  if ($getlevel($address,global) == Owner) { .notice $nick $adduser($2,$3) }&lt;br /&gt;
  else { .notice $nick You need to be an owner to use this command }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 on *:text:!edituser &amp;amp; &amp;amp; *:*:{&lt;br /&gt;
  if ($getlevel($address,global) == Owner) { .notice $nick $edituser($2,$3,$4,$5) }&lt;br /&gt;
  else { .notice $nick You need to be an owner to use this command }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 on *:text:!deluser &amp;amp;:*:{&lt;br /&gt;
  if ($getlevel($address,global) == Owner) { .notice $nick $deluser($2) }&lt;br /&gt;
  else { .notice $nick You need to be an owner to use this command }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 on *:text:!opme:*:{ &lt;br /&gt;
  ; we&amp;#039;ll use $checklevel to determine if the user has atleast accesslevel of Master in $chan (or higher Global level)&lt;br /&gt;
  if ($checklevel($address,$chan,master)) { mode $chan +o $nick }&lt;br /&gt;
  else { .notice $nick You have to be atleast master to use this command. }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 on *:text:!deopme:*:{ &lt;br /&gt;
  ; and here the same, the user needs to have atleast accesslevel of &amp;#039;test&amp;#039;&lt;br /&gt;
  if ($checklevel($address,$chan,test)) { mode $chan -o $nick }&lt;br /&gt;
  else { .notice $nick You have to be atleast at test level to use this command. }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 on *:text:!whoami:*:{ &lt;br /&gt;
  ; here we only check that is the user logged in, no other parameters given to $checklevel but the $address&lt;br /&gt;
  if ($checklevel($address)) { &lt;br /&gt;
    ; $getuser returns the username of the user (username isn&amp;#039;t the same as the nick)&lt;br /&gt;
    ; $getlevel returns the named/numbered level of the user on $chan or &amp;#039;Global&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
    .msg $chan You are known as $getuser($address) $+ , you have accesslevel of $iif( $getlevel($address,$chan) ,$v1,0) on $chan&lt;br /&gt;
    .msg $chan Your global level is $getlevel($address,Global) &lt;br /&gt;
  }&lt;br /&gt;
  else { .notice $nick You need to login to use this command. }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Cail</name></author>
	</entry>
</feed>