changeset 1:d60dea076954

Erster Release, basierend auf 0.6.2-1. Von diesem Release werden sp?tere ausgehen. user: Weegee weegee@taess.eu branch 'default' added Changelog.txt added INSTALL added install.kvs added pics/dev.png added src/de/aliases.kvs added src/de/events.kvs added src/de/popups.kvs added src/en/aliases.kvs added src/en/events.kvs added src/en/popups.kvs added src/guard.kvs added src/wnpB.kvs added src/wnpR.kvs added utils/installer.kvs
author Weegee weegee@taess.eu
date Mon, 28 Sep 2009 20:45:25 +0200
parents cb1fb6ea3c39
children 2fea591c9cc5 361974cf4b12
files Changelog.txt INSTALL install.kvs pics/dev.png src/de/aliases.kvs src/de/events.kvs src/de/popups.kvs src/en/aliases.kvs src/en/events.kvs src/en/popups.kvs src/guard.kvs src/wnpB.kvs src/wnpR.kvs utils/installer.kvs
diffstat 14 files changed, 1510 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Changelog.txt	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,94 @@
+### FailEngine v0.6.2 ###
+
+- Added banshee now playing-script
+
+### FailEngine v0.6.1 ###
+
+- Fixed dialog notifications from 0.6.0
+- Added a lot of raw events
+- Multilingual release
+
+### FailEngine v0.6.0 ###
+
+- Removed old, buggy commands
+- Dialog notifications on ban, kick and invite
+- List bans, invites and excepts and edit them if you're at least a halfop
+- Use of other icons
+- Clearly arranged channelpopup
+
+### FailEngine v0.5 ###
+
+- Huge code cleanup
+- Deleted old, useless commands
+- Fixed the popups
+
+### FailEngine v0.4 ###
+
+- Fixed a lot of bugs of v0.3
+- No need of the extra bashscript anymore
+- Uninstall command works
+- Added a few icons, sweet! :)
+- Code cleanup
+
+### FailEngine v0.3 ###
+
+- Not really an official release, but a huge bugfix
+
+### FailEngine v0.2 ###
+
+- First "serious" release
+- Uses a bashscript for now playing script
+- Most of the commands were removed. Why? Dunno ...
+
+### FailEngine v0.1 ###
+
+- This happened in my head only.
+
+===============================================================================
+
+### Failengine v0.6.2 ###
+
+- Banshee MP3-Skript hinzugefügt
+
+
+### FailEngine v0.6.1 ###
+
+- Dialog-Benachrichtigungen aus v0.6.0 korrigiert
+- Eine Menge RAW-Ereignisse hinzugefügt
+- Mehrsprachige Veröffentlichung
+
+### FailEngine v0.6.0 ###
+
+- Alte, fehlerhafte Befehle entfernt
+- Dialog-Benachrichtigungen bei Ban, Kick und Invite
+- Die Ban-, Invite- und Ausnahmeliste anzeigen (und editieren, sofern man mindestens Halfop ist)
+- Benutzung anderer Icons
+- Übersichtliches channelpopup
+
+### FailEngine v0.5 ###
+
+- Große Säuberung des Codes
+- Alte, unnötige Befehle entfernt
+- Popups wurden repariert
+
+### FailEngine v0.4 ###
+
+- Eine Menge Fehler von Version 0.3 korrigiert
+- Das Bashscript wird nicht mehr benötigt
+- Die Deinstallation funktioniert
+- Ein paar Icons hinzugefügt, hübsch! :)
+- Code aufgeräumt
+
+### FailEngine v0.3 ###
+
+- Nicht wirklich eine offizielle Veröffentlichung, aber eine große Fehlerkorrektur
+
+### FailEngine v0.2 ###
+
+- Erste "wirkliche" Veröffentlichung
+- Benutzt ein Bashscript für das Ausführen des "now playing"-Scripts
+- Die meisten Befehle wurden entfernt. Wieso? Keine Ahnung ...
+
+### FailEngine v0.1 ###
+
+- Dies ist nur in meinem Kopf geschehen ;)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/INSTALL	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,21 @@
+####################
+### Installation ###
+####################
+
+1. KVIrc 3.2.4 or newer needed!
+2. Open KVIrc. Press CTRL + ALT + M
+3. A windows pops up. Choose "Install Addon"
+4. Search the install.kvs of the FailEngine and install it
+5. That's it, you're done!
+
+---
+
+####################
+### Installation ###
+####################
+
+1. KVIrc 3.2.4 oder neuer wird benötigt!
+2. Öffne KVIrc. Drücke dort STRG + ALT + M
+3. Ein Popup öffnet sich. Wähle dort "Addon installieren"
+4. Suche nach der install.kvs der FailEngine und installiere sie
+5. Fertig!
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/install.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,213 @@
+# FailEngine
+
+addon.register("fe","0.6.3","FailEngine $char(34)Psyduck$char(34)","The development release of the FailEngine","3.2.4","$file.extractPath($0)/pics/dev.png")
+{
+##########################	
+### Uninstall commands ###
+##########################
+
+	# Delete our aliases
+	alias(wfver){};
+	alias(wnp){};
+	alias(wos){};
+	alias(wusers){};
+	alias(wver){};
+
+	# Delete all popups and/or reset them
+	defpopup(channeltextview)
+	{
+		extpopup($tr("Channels"),channels,46)
+	
+		item($tr("&Join Channels..."),46) ($server)
+		{
+			if($option(boolShowChannelsJoinDialogAsToplevel))channelsjoin.open -t;else channelsjoin.open
+		}
+	
+		separator
+	
+		item($tr("&Hop") $0,145)
+		{
+			hop $0
+		}
+	
+		item($tr("&Part") $0,40)
+		{
+			if($channel($0)) eval "part $0 $option(stringPartMessage)";
+		}
+	
+		separator
+	
+		extpopup(C&TCP,ctcp,51)
+	
+		separator
+	
+		item(/NAMES $0,75)
+		{
+			names $0;
+		}
+	
+		item(/WHO $0,75)
+		{
+			who $0;
+		}
+	
+		item($tr("Notify Avatar"),57)
+		{
+			avatar.notify $0
+		}
+	
+		separator
+	
+		item($tr("Copy Channel URL to Clipboard"),259)
+		{
+			str.toClipboard $chan.getUrl
+		}
+	
+		item($tr("Clear Buffer"),121)
+		{
+			clear;
+		}
+	};
+	defpopup(lists){};
+	defpopup(irc){};
+	defpopup(sys){};
+	defpopup(misc){};
+	defpopup(nickserv){};
+	defpopup(chanserv){};
+	defpopup(away){};
+
+	# And don't forget the old one ...
+	defpopup(cmd){};
+
+	# Delete all events
+	event(OnMeKick,WRejoin){};
+	event(OnHighlight,WHL){};
+	event(OnInvite,WInvite){};
+	event(OnMeKick,WKick){};
+	event(OnMeBan,WBan){};
+
+	# And also the raw events
+	event(403,W403){};
+	event(404,W404){};
+	event(408,W408){};
+	event(306,W306){};
+	event(305,W305){};
+	event(341,W341){};
+	event(443,W443){};
+	event(482,W482){};
+	event(432,W432){};
+	event(433,W433){};
+	event(437,W437){};
+	event(471,W471){};
+	event(473,W473){};
+	event(474,W474){};
+	event(475,W475){};
+	event(477,W477){};
+	event(485,W485){};
+
+	# Clear the modified options
+	option stringCtcpVersionPostfix $nothing;
+	option stringCtcpSourcePostfix $nothing;
+
+	if (%WuseSG == "1")
+	{
+		option booluseantispamonprivmsg "%WoptbeforeSG[1]";
+		option booluseantispamonnotice "%WoptbeforeSG[2]";
+		option boolsilentantispam "%WoptbeforeSG[3]";
+		option stringlistspamwords "%WoptbeforeSG[4]";
+		option boolusectcpfloodprotection "%WoptbeforeSG[5]";
+		option uintmaxctcprequests "%WoptbeforeSG[6]";
+		option uintctcpfloodcheckinterval "%WoptbeforeSG[7]";
+		option boolenableignoreonprivmsg "%WoptbeforeSG[8]";
+		option boolenableignoreonnotice "%WoptbeforeSG[9]";
+		option boolverboseignore "%WoptbeforeSG[10]";
+		option boolcreatequeryonprivmsg "%WoptbeforeSG[11]";
+		option boolenablequerytracing "%WoptbeforeSG[12]";
+		option boolshowextendedinfoinquerylabel "%WoptbeforeSG[13]";
+		option boolrejoinchannelonkick "%WoptbeforeSG[14]";
+		option boolautojoinoninvite "%WoptbeforeSG[15]";
+	}
+}
+
+# Getting the installer ...
+%Mypath = $file.extractPath($0)
+parse %Mypath/utils/installer.kvs
+
+# The installer will copy our files
+%installer = $new(installer,0,myinstaller)
+file.mkdir $file.localdir("pics/fe")
+%installer->$copyFiles("%Mypath/pics/","*.png",$file.localdir("pics/fe"))
+
+# finally kill the installer helper
+delete %installer
+
+# Run first configuration
+dialog.message("Configure $char(40)1$char(47)4$char(41)","Welcome to the FailEngine setup! You have to configure FailEngine before you can use it.<br> Please answer to all questions and don't close any window, otherwise you'll have a destroyed addon installed on your system.",260,"OK")
+{
+	dialog.message("Configure $char(40)2$char(47)4$char(41)","Do you want to use the <b>German</b> version of the FailEngine or the <b>English</b> one? No matter what you choose, the setup will continue in English. And disregard the icons displayed on the buttons - they don't have any relevance.",260,"English","German")
+	{
+		if($0 == 0)
+		{
+			parse %Mypath/src/en/aliases.kvs
+			parse %Mypath/src/en/events.kvs
+			parse %Mypath/src/en/popups.kvs
+			option stringCtcpVersionPostfix " Running with $b()FailEngine v0.6.3 $char(34)Psyduck$char(34)$o()";
+			option stringCtcpSourcePostfix " Get the current version of the FailEngine on $b()http://flyurl.de/fe$o()";
+		}
+		else if($0 == 1)
+		{
+			parse %Mypath/src/de/aliases.kvs
+			parse %Mypath/src/de/events.kvs
+			parse %Mypath/src/de/popups.kvs
+			option stringCtcpVersionPostfix " Enthält die $b()FailEngine v0.6.3 $char(34)Psyduck$char(34)$o()";
+			option stringCtcpSourcePostfix " Hol dir die aktuelle Version der FailEngine auf $b()http://flyurl.de/fe$o()";
+		}
+		dialog.message("Configure $char(40)3$char(47)4$char(41)","Do you want to enable the <i>FailEngine security guard</i>? It's a script which includes spam protection in private messages and notices and a CTCP flood protection. It also enables a few options which provide more safety.<br> If you don't like a modified setting you can reset it.",260,"Enable $char(40)recommended$char(41)","Disable")
+		{
+			if($0 == 0)
+			{
+				%WoptbeforeSG = $array("$option(booluseantispamonprivmsg)","$option(booluseantispamonnotice)","$option(boolsilentantispam)","$option(stringlistspamwords)","$option(boolusectcpfloodprotection)","$option(uintmaxctcprequests)","$option(uintctcpfloodcheckinterval)","$option(boolenableignoreonprivmsg)","$option(boolenableignoreonnotice)","$option(boolverboseignore)","$option(boolcreatequeryonprivmsg)","$option(boolenablequerytracing)","$option(boolshowextendedinfoinquerylabel)","$option(boolrejoinchannelonkick)","$option(boolautojoinoninvite)");
+				%WuseSG = "1";
+				parse %Mypath/src/guard.kvs
+			}
+			dialog.message("Configure $char(40)4$char(47)4$char(41)","Are you using Rhythmbox or Banshee as your favorite music player?",260,"Rhythmbox","Banshee")
+			{
+				if($0 == 0)
+				{
+					parse %Mypath/src/wnpR.kvs
+				}
+				else if($0 == 1)
+				{
+					parse %Mypath/src/wnpB.kvs
+				}
+				dialog.message("Configure - Done!","That's all, you're done!",260,"OK"){};
+			};
+		};
+	};
+};
+
+# configure callback
+addon.setconfigurecallback("fe")
+{
+	dialog.message("Configure","Do you want to reset all modified options to their default value?",260,"Yes","No")
+	{
+		if ($0 == 0)
+		{
+		option booluseantispamonprivmsg "%WoptbeforeSG[1]";
+		option booluseantispamonnotice "%WoptbeforeSG[2]";
+		option boolsilentantispam "%WoptbeforeSG[3]";
+		option stringlistspamwords "%WoptbeforeSG[4]";
+		option boolusectcpfloodprotection "%WoptbeforeSG[5]";
+		option uintmaxctcprequests "%WoptbeforeSG[6]";
+		option uintctcpfloodcheckinterval "%WoptbeforeSG[7]";
+		option boolenableignoreonprivmsg "%WoptbeforeSG[8]";
+		option boolenableignoreonnotice "%WoptbeforeSG[9]";
+		option boolverboseignore "%WoptbeforeSG[10]";
+		option boolcreatequeryonprivmsg "%WoptbeforeSG[11]";
+		option boolenablequerytracing "%WoptbeforeSG[12]";
+		option boolshowextendedinfoinquerylabel "%WoptbeforeSG[13]";
+		option boolrejoinchannelonkick "%WoptbeforeSG[14]";
+		option boolautojoinoninvite "%WoptbeforeSG[15]";
+		}
+	}
+}
\ No newline at end of file
Binary file pics/dev.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/de/aliases.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,27 @@
+##########################	
+### Aliases	       ###
+##########################
+
+# KVIrc version
+alias(wver) 
+{
+	say "$k(5)Ich benutze im Moment $k(4)KVIrc $version(v) $char(34)$version(r)$char(34)$k(5) mit $k(4)FailEngine v0.6.3 $char(34)Psyduck$char(34)";
+}
+
+# FailEngine information
+alias(wfver) 
+{
+	dialog.message("Informationen über die aktuelle Version","Du benutzt im Moment <b>FailEngine v0.6.3 $char(34)Psyduck$char(34)</b>.<br> Fehler gefunden? <a href="http://flyurl.de/bugs">Melde ihn</a>!<br> Mehr Informationen? Betrete <b>#FailEngine</b> auf dem <b>irc.rizon.net</b>!",25,"OK"){};
+}
+
+# Information über die Benutzer in $target()
+alias(wusers) 
+{
+	dialog.message("Information","Es sind <b>$chan.usercount($channel)</b> Benutzer in <b>$target()</b>. Namen: <b>$chan.users()</b>",220,"OK"){};
+}
+
+# Information das Betriebssystem
+alias(wos) 
+{
+	exec("lsb_release -ds") { say "$k(5)Betriebssystem:$k(4) $1"; };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/de/events.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,201 @@
+##########################	
+### Ereignisse	       ###
+##########################
+
+##########################	
+### RAW-Ereignisse     ###
+##########################
+
+# Kann Channel nicht betreten (+l)
+event(471,W471)
+{
+	%R4711 = $3;
+	dialog.message("Information","Kann den Channel <b>%R4711</b> nicht betreten: Der Channel ist voll (+l wurde gesetzt)",220,"OK"){};
+}
+
+# Kann Channel nicht betreten (+i)
+event(473,W473)
+{
+	%R4731 = $3;
+	%R4732 = $4;
+	dialog.message("Information","Kann den Channel <b>%R4731</b> nicht betreten: Der Channel ist nur für eingeladene Benutzer (+i wurde gesetzt)",220,"OK"){};
+}
+
+# Kann Channel nicht betreten (+b)
+event(474,W474)
+{
+	%R4741 = $3;
+	%R4742 = $4;
+	dialog.message("Information","Kann den Channel <b>%R4741</b> nicht betreten: Gebannt (+b wurde gesetzt)",220,"OK"){};
+}
+
+# Kann Channel nicht betreten (+k)
+event(475,W475)
+{
+	%R4751 = $3;
+	%R4752 = $4;
+	dialog.message("Information","Kann den Channel <b>%R4751</b> nicht betreten: Ein Passwort wurde gesetzt (+k)",220,"OK"){};
+}
+
+# Kann Channel nicht betreten (nur registrierte Nicks)
+event(477,W477)
+{
+	%R4771 = $3;
+	%R4772 = $4;
+	dialog.message("Information","Kann den Channel <b>%R4771</b> nicht betreten: Nur für registrierte Nicknamen",220,"OK"){};
+}
+
+# Kann Channel nicht betreten (Grund)
+event(485,W485)
+{
+	%R4851 = $3;
+	%R4852 = $4;
+	dialog.message("Information","Kann den Channel <b>%R4851</b> nicht betreten. Angegebener Grund: %R4852",220,"OK"){};
+}
+
+# Kann den Nick nicht ändern während ein Ban gesetzt wurde
+event(437,W437)
+{
+	%R4371 = $3;
+	%R4372 = $4;
+	dialog.message("Information","Kann den Nick nicht zu <b>%R4371</b> ändern, ein Ban wurde auf dich gesetzt",220,"OK"){};
+}
+
+# Nick wird bereits benutzt
+event(433,W433)
+{
+	%R4331 = $3;
+	%R4332 = $4;
+	dialog.message("Information","Kann den Nick nicht zu <b>%R4331</b> ändern, da er bereits benutzt wird",220,"OK"){};
+}
+
+# Fehlerhafter Nick
+event(432,W432)
+{
+	%R4321 = $3;
+	%R4322 = $4;
+	dialog.message("Information","Kann den Nick nicht zu <b>%R4321</b> ändern, da er Sonderzeichen enthält",220,"OK"){};
+}
+
+# Invite fehlgeschlagen - kein Op
+event(482,W482)
+{
+	%R4821 = $3;
+	%R4822 = $4:
+	dialog.message("Information","Kann niemanden nach <b>%R4821</b> einladen: Du bist kein Channel Op",220,"OK"){};
+}
+
+# Invite fehlgeschlagen - der Benutzer ist bereits im Channel
+event(443,W443)
+{
+	%R4431 = $3;
+	%R4432 = $4;
+	%R4433 = $5;
+	dialog.message("Information","<b>%R4431</b> befindet sich bereits im Channel <b>%R4432</b>",220,"OK"){};
+}
+
+# Jemand wurde eingeladen
+event(341,W341)
+{
+	%R3411 = $3;
+	%R3412 = $4;
+	dialog.message("Information","Du hast <b>%R3411</b> nach <b>%R3412</b> eingeladen",220,"OK"){};
+}
+
+# Anwesend
+event(305,W305)
+{
+	%R305 = $3;
+	dialog.message("Information","Du bist wieder als anwesend markiert worden",220,"OK"){};
+}
+
+# Abwesend
+event(306,W306)
+{
+	%R306 = $3;
+	dialog.message("Information","Du wurdest als abwesend markiert",220,"OK"){};
+}
+
+# Cannot use control codes on this channel
+event(408,W408)
+{
+	dialog.message("Information","Es ist nicht möglich, Farbcodes etc. in diesem Channel zu benutzen. Die Nachricht wurde nicht gesendet.",220,"OK"){};
+}
+
+# Kein solcher Channel
+event(403,W403)
+{
+	%R403 = $3;
+	dialog.message("Information","Dieser Channel und/oder Name existiert nicht: <b>%R403</b>",220,"OK"){};
+}
+
+# Kann Text nicht an den Channel senden
+event(404,W404)
+{
+	%R404 = $3;
+	dialog.message("Information","Kann keinen Text an den Channel <b>%R404</b> senden",220,"OK"){};
+}
+
+##########################	
+### Normale events     ###
+##########################
+
+# Kick dialog
+event(OnMeKick,WKick)
+{
+	%nick = $0;
+	%rsn = $3;
+	dialog.message("Information","<b>%nick</b> hat dich <b>$char(40)$me$char(41)</b> von <b>$chan.name()</b> gekickt. Begründung: <b>%rsn</b>",220,"OK"){};
+	unset %nick %rsn;
+}
+
+# Ban dialog
+event(OnMeBan,WBan)
+{
+	%nick = $0;
+	%mask = $3;
+	dialog.message("Information","<b>%nick</b> hat dich <b>$char(40)$me$char(41)</b> in <b>$chan.name()</b> gebannt. Banmaske: <b>%mask</b>",220,"OK"){};
+	unset %nick %mask;
+}
+		
+# Invite dialog
+event(OnInvite,WInvite)
+{
+	%Nick = $0;
+	%Chan = $3;
+
+	dialog.message("Information","<b>%Nick</b> hat dich <b>$char(40)$me$char(41)</b> nach <b>%Chan</b> eingeladen.",220,"Betreten","Zurückweisen")
+	{
+		if ($0 == 0)
+		{
+			join %Chan;
+		}
+		else
+		{
+			dialog.message("Information","Einladung von <b>%Nick</b> zurückgewiesen.",220,"OK"){};
+		}
+	};
+}
+
+# Autorejoin (nach 5 Sekunden, keine Angst :P)
+event(OnMeKick,WRejoin)
+{
+	timer -s (WRejoin,5000)
+	{
+		join $chan.name();
+	}
+}
+
+# Highlight extras
+event(OnHighlight,WHL)
+{
+	exec("beep -f 440 && beep -f 220"){};
+	if ($target($channel) == $null) 
+	{
+		echo -w=$active() "$k(04,01)$b()>>> $0 hat dich in einem Query gehighlightet <<<$o()";
+	}
+	else 
+	{
+		echo -w=$active() "$k(04,01)$b()>>> $0 hat dich in $target($channel) gehighlightet <<<$o()";
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/de/popups.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,247 @@
+##########################	
+### Popups	       ###
+##########################
+
+# Normales channelpopup (Rechtsklick ins Fenster)
+defpopup (channeltextview)
+{
+	item($tr("FailEngine v0.6.3"),111)
+	{
+		wfver;
+	}
+
+	separator
+
+	extpopup($tr("IRC"),irc,208)
+
+	separator
+
+	extpopup($tr("System"),sys,142)
+
+	separator
+ 
+	extpopup($tr("Diverses"),misc,201)
+
+	separator
+}
+
+# Diverse Extras
+defpopup (misc)
+{
+	item($tr("Zeige den gerade spielenden Song"),234)
+	{
+		wnp;
+	}
+}
+
+# Systemextras
+defpopup (sys)
+{
+	item($tr("Zeige Informationen über das Betriebssystem"),25)
+	{
+		wos;
+	}
+	item($tr("Zeige aktuelle KVIrc-Version"),16)
+	{
+		wver;
+	}
+	item($tr("Zeige Informationen über die FailEngine"),111)
+	{
+		wfver;
+	}
+}
+
+# IRC Extras
+defpopup (irc)
+{
+	item($tr("$0 neu betreten"),145)
+	{
+		hop $0;
+	}
+	item($tr("$0 verlassen"),40)
+	{
+		if($channel($0)) eval "part $0 $option(stringPartMessage)";
+	}
+	item($tr("WHO") $0,75)
+	{
+		who $0;
+	}
+	item($tr("NAMES") $0,75)
+	{
+		names $0;
+	}
+	item($tr("Leere den Puffer von") $0,121)
+	{
+		clear;
+	}
+	item($tr("Zeige Informationen über die Benutzer in") $0,113)
+	{
+		wusers;
+	}
+
+	separator
+
+	extpopup($tr("Listen von") $0,lists,204)
+
+	separator
+
+	extpopup($tr("CTCP"),ctcp,51)
+
+	separator
+
+	extpopup($tr("Abwesend"),away,88)
+
+	separator
+
+	extpopup($tr("NickServ"),nickserv,164)
+
+	separator
+
+	extpopup($tr("ChanServ"),chanserv,165)
+
+	separator
+}
+
+# Listenpopup
+defpopup (lists)
+{
+	item($tr("Zeige Banlist von") $0,268)
+	{
+		mode $0 +b;
+		if ($chan.isMeHalfOp == 1)
+		{
+			dialog.message("Frage","Was soll mit der Banlist getan werden?",48,"Bearbeiten","Nichts")
+			{
+				if ($0 == 0)
+				{
+					dialog.textinput -d="+/-b <Banmask>" -i="48" ("Die Banlist bearbeiten","Den Befehl anpassen.","Fertig","Abbruch")
+					{
+						if ($0 == 0)
+						{
+							mode $target($channel) $1-;
+						}
+					}
+				}
+			}
+		}
+	}
+	item($tr("Zeige Invitelist von") $0,296)
+	{
+		mode $0 +I;
+		if ($chan.isMeHalfOp == 1)
+		{
+			dialog.message("Frage","Was soll mit der Invitelist getan werden?",48,"Bearbeiten","Nichts")
+			{
+				if ($0 == 0)
+				{
+					dialog.textinput -d="+/-I <Hostmask>" -i="48" ("Die Invitelist bearbeiten","Den Befehl anpassen.","Fertig","Abbruch")
+					{
+						if ($0 == 0)
+						{
+							mode $target($channel) $1-;
+						}
+					}
+				}
+			}
+		}
+	}
+	item($tr("Zeige Ausnahmeliste von") $0,278)
+	{
+		mode $0 +eb;
+		if ($chan.isMeHalfOp == 1)
+		{
+			dialog.message("Frage","Was soll mit der Ausnahmeliste getan werden?",48,"Bearbeiten","Nichts")
+			{
+				if ($0 == 0)
+				{
+					dialog.textinput -d="+/-e <Hostmask>" -i="48" ("Die Ausnahmeliste bearbeiten","Den Befehl anpassen.","Fertig","Abbruch")
+					{
+						if ($0 == 0)
+						{
+							mode $target($channel) $1-;
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+# Nickserv-Extras
+defpopup (nickserv)
+{
+	item($tr("Ghost ..."),272)
+	{
+		dialog.textinput -d="<Nickname> <Passwort>" ("Nickname und Passwort","Den Nicknamen und das Passwort eingeben","OK","Abbruch")
+		{
+			if ($0 == 0)
+			{
+				msg NickServ ghost $1 $2;
+			}
+		}
+	}
+	item($tr("Registrieren ..."),164)
+	{
+		dialog.textinput -d="<Passwort> <E-Mail>" ("Passwort und E-Mail","Das Passwort und eine E-Mail Adresse eingeben","OK","Abbruch")
+		{
+			if ($0 == 0)
+			{
+					msg NickServ register $1 $2;
+			}
+		}
+	}
+	item($tr("Identifizieren ..."),164)
+	{	
+		dialog.textinput -d="<Passwort>" ("Passwort","Das Passwort eingeben","OK","Abbruch")
+		{
+			if ($0 == 0)
+			{
+					msg NickServ identify $1;
+			}
+		}
+	}
+}
+
+# Chanserv-Extras
+defpopup (chanserv)
+{
+	item($tr("Registrieren ..."),165)
+	{
+		dialog.textinput -d="<Channel> <Passwort> <Beschreibung>" ("Channel, Passwort und Beschreibung","Den Channel, das Passwort und eine Beschreibung eingeben","OK","Abbruch")
+		{
+			if ($0 == 0)
+			{
+					msg Chanserv register $1 $2 $3-;
+			}
+		}
+	}
+	item($tr("Identifizieren ..."),165)
+	{
+		dialog.textinput -d="<Channel> <Passwort>" ("Channel und Passwort","Den Channel und das Passwort eingeben","OK","Abbruch")
+		{
+			if ($0 == 0)
+			{
+					msg Chanserv identify $1 $2;
+			}
+		}
+	}
+} 
+
+# "Abwesend"-popup
+defpopup (away)
+{
+	item($tr("Zurück"),217)
+	{
+		back;
+	}	
+	item($tr("Abwesend ..."),221)
+	{
+		dialog.textinput -d="Einfach mal weg ..." ("Grund","Den Abwesenheitsgrund eingeben","OK")
+		{
+			if ($0 == 0)
+			{
+					away $1-;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/en/aliases.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,27 @@
+##########################	
+### Aliases	       ###
+##########################
+
+# KVIrc version
+alias(wver) 
+{
+	say "$k(5)I am currently using $k(4)KVIrc $version(v) $char(34)$version(r)$char(34)$k(5) with $k(4)FailEngine v0.6.3 $char(34)Psyduck$char(34)";
+}
+
+# FailEngine information
+alias(wfver) 
+{
+	dialog.message("Information about current version","You are currently using <b>FailEngine v0.6.3 $char(34)Psyduck$char(34)</b>.<br> Found any bugs? <a href="http://flyurl.de/bugs">Report them</a>!<br> Want more information? Join <b>#FailEngine</b> on <b>irc.rizon.net</b>!",25,"OK"){};
+}
+
+# Information about users on $target()
+alias(wusers) 
+{
+	dialog.message("Information","There are <b>$chan.usercount($channel)</b> users on <b>$target()</b>. Names: <b>$chan.users()</b>",220,"OK"){};
+}
+
+# Information about the operating system
+alias(wos) 
+{
+	exec("lsb_release -ds") { say "$k(5)Running operating system:$k(4) $1"; };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/en/events.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,204 @@
+##########################	
+### Events	       ###
+##########################
+
+##########################	
+### Raw events	       ###
+##########################
+
+# Cannot join channel (+l)
+event(471,W471)
+{
+	%R4711 = $3;
+	%R4712 = $4;
+	dialog.message("Information","<b>%R4711</b> - %R4712 - Channel is full",220,"OK"){};
+}
+
+# Cannot join channel (+i)
+event(473,W473)
+{
+	%R4731 = $3;
+	%R4732 = $4;
+	dialog.message("Information","<b>%R4731</b> - %R4732 - Channel is invite only",220,"OK"){};
+}
+
+# Cannot join channel (+b)
+event(474,W474)
+{
+	%R4741 = $3;
+	%R4742 = $4;
+	dialog.message("Information","<b>%R4741</b> - %R4742 - You are banned on the channel",220,"OK"){};
+}
+
+# Cannot join channel (+k)
+event(475,W475)
+{
+	%R4751 = $3;
+	%R4752 = $4;
+	dialog.message("Information","<b>%R4751</b> - %R4752 - Channel key is set",220,"OK"){};
+}
+
+# Cannot join channel (registered nicks only)
+event(477,W477)
+{
+	%R4771 = $3;
+	%R4772 = $4;
+	dialog.message("Information","<b>%R4771</b> - %R4772",220,"OK"){};
+}
+
+# Cannot join channel (reason)
+event(485,W485)
+{
+	%R4851 = $3;
+	%R4852 = $4;
+	dialog.message("Information","<b>%R4851</b> - %R4852",220,"OK"){};
+}
+
+# Cannot change nick while banned on channel
+event(437,W437)
+{
+	%R4371 = $3;
+	%R4372 = $4;
+	dialog.message("Information","%R4372 <b>%R4371</b>",220,"OK"){};
+}
+
+# Nick already in use
+event(433,W433)
+{
+	%R4331 = $3;
+	%R4332 = $4;
+	dialog.message("Information","Cannot change nick to <b>%R4331</b>: %R4332",220,"OK"){};
+}
+
+# Erroneus nick
+event(432,W432)
+{
+	%R4321 = $3;
+	%R4322 = $4;
+	dialog.message("Information","Cannot change nick to <b>%R4321</b>: %R4322",220,"OK"){};
+}
+
+# Invite failed, not a channel op
+event(482,W482)
+{
+	%R4821 = $3;
+	%R4822 = $4:
+	dialog.message("Information","Cannot invite anyone to <b>%R4821</b>: %R4822",220,"OK"){};
+}
+
+# Invite failed, nick is already on channel
+event(443,W443)
+{
+	%R4431 = $3;
+	%R4432 = $4;
+	%R4433 = $5;
+	dialog.message("Information","<b>%R4431</b> %R4433 <b>%R4432</b>",220,"OK"){};
+}
+
+# Invited someone
+event(341,W341)
+{
+	%R3411 = $3;
+	%R3412 = $4;
+	dialog.message("Information","You invited <b>%R3411</b> into <b>%R3412</b>",220,"OK"){};
+}
+
+# Marked as being back
+event(305,W305)
+{
+	%R305 = $3;
+	dialog.message("Information","%R305",220,"OK"){};
+}
+
+# Marked as being away
+event(306,W306)
+{
+	%R306 = $3;
+	dialog.message("Information","%R306",220,"OK"){};
+}
+
+# Cannot use control codes on this channel
+event(408,W408)
+{
+	%R4081 = $4;
+	%R4082 = $5;
+	dialog.message("Information","%R4081<br> %R40832",220,"OK"){};
+}
+
+# No such channel
+event(403,W403)
+{
+	%R403 = $3;
+	dialog.message("Information","No such channel or nickname: <b>%R403</b>",220,"OK"){};
+}
+
+# Cannot send text to channel
+event(404,W404)
+{
+	%R404 = $3;
+	dialog.message("Information","Cannot send text to channel <b>%R404</b>",220,"OK"){};
+}
+
+##########################	
+### Regular events     ###
+##########################
+
+# Kick dialog
+event(OnMeKick,WKick)
+{
+	%nick = $0;
+	%rsn = $3;
+	dialog.message("Information","<b>%nick</b> kicked you <b>$char(40)$me$char(41)</b> from <b>$chan.name()</b>. Given reason: <b>%rsn</b>",220,"OK"){};
+	unset %nick %rsn;
+}
+
+# Ban dialog
+event(OnMeBan,WBan)
+{
+	%nick = $0;
+	%mask = $3;
+	dialog.message("Information","<b>%nick</b> banned you <b>$char(40)$me$char(41)</b> on <b>$chan.name()</b>. Banmask: <b>%mask</b>",220,"OK"){};
+	unset %nick %mask;
+}
+		
+# Invite dialog
+event(OnInvite,WInvite)
+{
+	%Nick = $0;
+	%Chan = $3;
+
+	dialog.message("Information","<b>%Nick</b> invited you <b>$char(40)$me$char(41)</b> into <b>%Chan</b>",220,"Join","Refuse")
+	{
+		if ($0 == 0)
+		{
+			join %Chan;
+		}
+		else
+		{
+			dialog.message("Information","Invitation of <b>%Nick</b> refused.",220,"OK"){};
+		}
+	};
+}
+
+# Autorejoin (after 5 seconds, don't worry :P)
+event(OnMeKick,WRejoin)
+{
+	timer -s (WRejoin,5000)
+	{
+		join $chan.name();
+	}
+}
+
+# Highlight extras
+event(OnHighlight,WHL)
+{
+	exec("beep -f 440 && beep -f 220"){};
+	if ($target($channel) == $null) 
+	{
+		echo -w=$active() "$k(04,01)$b()>>> $0 has highlighted you in a Query <<<$o()";
+	}
+	else 
+	{
+		echo -w=$active() "$k(04,01)$b()>>> $0 has highlighted you in $target($channel) <<<$o()";
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/en/popups.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,247 @@
+##########################	
+### Popups	       ###
+##########################
+
+# Regular channel popup (right-click in the channel window)
+defpopup (channeltextview)
+{
+	item($tr("FailEngine v0.6.3"),111)
+	{
+		wfver;
+	}
+
+	separator
+
+	extpopup($tr("IRC"),irc,208)
+
+	separator
+
+	extpopup($tr("System"),sys,142)
+
+	separator
+ 
+	extpopup($tr("Miscellaneous"),misc,201)
+
+	separator
+}
+
+# Miscellaneous extras
+defpopup (misc)
+{
+	item($tr("Show current playing Song"),234)
+	{
+		wnp;
+	}
+}
+
+# System extras
+defpopup (sys)
+{
+	item($tr("Show information about the OS"),25)
+	{
+		wos;
+	}
+	item($tr("Show current KVIrc version"),16)
+	{
+		wver;
+	}
+	item($tr("Show information about the FailEngine"),111)
+	{
+		wfver;
+	}
+}
+
+# IRC extras
+defpopup (irc)
+{
+	item($tr("Hop") $0,145)
+	{
+		hop $0;
+	}
+	item($tr("Part") $0,40)
+	{
+		if($channel($0)) eval "part $0 $option(stringPartMessage)";
+	}
+	item($tr("WHO") $0,75)
+	{
+		who $0;
+	}
+	item($tr("NAMES") $0,75)
+	{
+		names $0;
+	}
+	item($tr("Clear Buffer of") $0,121)
+	{
+		clear;
+	}
+	item($tr("Show information about the users on") $0,113)
+	{
+		wusers;
+	}
+
+	separator
+
+	extpopup($tr("Lists of") $0,lists,204)
+
+	separator
+
+	extpopup($tr("CTCP"),ctcp,51)
+
+	separator
+
+	extpopup($tr("Away"),away,88)
+
+	separator
+
+	extpopup($tr("NickServ"),nickserv,164)
+
+	separator
+
+	extpopup($tr("ChanServ"),chanserv,165)
+
+	separator
+}
+
+# Lists popup
+defpopup (lists)
+{
+	item($tr("Show banlist of") $0,268)
+	{
+		mode $0 +b;
+		if ($chan.isMeHalfOp == 1)
+		{
+			dialog.message("Question","What do you want to do with the banlist?",48,"Edit it","Nothing")
+			{
+				if ($0 == 0)
+				{
+					dialog.textinput -d="+/-b <Banmask>" -i="48" ("Editing the banlist","Adjust the command.","Done","Cancel")
+					{
+						if ($0 == 0)
+						{
+							mode $target($channel) $1-;
+						}
+					}
+				}
+			}
+		}
+	}
+	item($tr("Show invitelist of") $0,296)
+	{
+		mode $0 +I;
+		if ($chan.isMeHalfOp == 1)
+		{
+			dialog.message("Question","What do you want to do with the invitelist?",48,"Edit it","Nothing")
+			{
+				if ($0 == 0)
+				{
+					dialog.textinput -d="+/-I <Hostmask>" -i="48" ("Editing the invitelist","Adjust the command.","Done","Cancel")
+					{
+						if ($0 == 0)
+						{
+							mode $target($channel) $1-;
+						}
+					}
+				}
+			}
+		}
+	}
+	item($tr("Show except list of") $0,278)
+	{
+		mode $0 +eb;
+		if ($chan.isMeHalfOp == 1)
+		{
+			dialog.message("Question","What do you want to do with the except list?",48,"Edit it","Nothing")
+			{
+				if ($0 == 0)
+				{
+					dialog.textinput -d="+/-e <Hostmask>" -i="48" ("Editing the except list","Adjust the command.","Done","Cancel")
+					{
+						if ($0 == 0)
+						{
+							mode $target($channel) $1-;
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+# Nickserv extras
+defpopup (nickserv)
+{
+	item($tr("Ghost ..."),272)
+	{
+		dialog.textinput -d="<Nickname> <Password>" ("Nickname and Password","Enter the Nickname and the Password","OK","Cancel")
+		{
+			if ($0 == 0)
+			{
+				msg NickServ ghost $1 $2;
+			}
+		}
+	}
+	item($tr("Register ..."),164)
+	{
+		dialog.textinput -d="<Password> <E-Mail>" ("Password and E-Mail","Enter the Password and the E-Mail","OK","Cancel")
+		{
+			if ($0 == 0)
+			{
+					msg NickServ register $1 $2;
+			}
+		}
+	}
+	item($tr("Identify ..."),164)
+	{	
+		dialog.textinput -d="<Password>" ("Password","Enter the Password","OK","Cancel")
+		{
+			if ($0 == 0)
+			{
+					msg NickServ identify $1;
+			}
+		}
+	}
+}
+
+# Chanserv extras
+defpopup (chanserv)
+{
+	item($tr("Register ..."),165)
+	{
+		dialog.textinput -d="<Channel> <Password> <Description>" ("Channel, Password and Description","Enter the Channel, the Password and the Description","OK","Cancel")
+		{
+			if ($0 == 0)
+			{
+					msg Chanserv register $1 $2 $3-;
+			}
+		}
+	}
+	item($tr("Identify ..."),165)
+	{
+		dialog.textinput -d="<Channel> <Password>" ("Channel and Password","Enter the Channel and the Password","OK","Cancel")
+		{
+			if ($0 == 0)
+			{
+					msg Chanserv identify $1 $2;
+			}
+		}
+	}
+} 
+
+# Away popup
+defpopup (away)
+{
+	item($tr("Back"),217)
+	{
+		back;
+	}	
+	item($tr("Manual away ..."),221)
+	{
+		dialog.textinput -d="Just gone ..." ("Reason","Enter the Reason","OK")
+		{
+			if ($0 == 0)
+			{
+					away $1-;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/guard.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,27 @@
+##########################	
+### Security Guard     ###
+##########################
+
+# Antispam
+option booluseantispamonprivmsg "1";
+option booluseantispamonnotice "1";
+option boolsilentantispam "0";
+option stringlistspamwords "psybnc, sex, porn";
+
+# CTCP Flood protection
+option boolusectcpfloodprotection "1";
+option uintmaxctcprequests "2";
+option uintctcpfloodcheckinterval "5";
+
+# Ignore
+option boolenableignoreonprivmsg "1";
+option boolenableignoreonnotice "1";
+option boolverboseignore "1";
+
+# Other security options
+option boolcreatequeryonprivmsg "1";
+option boolenablequerytracing "1";
+option boolshowextendedinfoinquerylabel "1";
+option boolrejoinchannelonkick "0";
+option boolautojoinoninvite "0";
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/wnpB.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,18 @@
+# Current playing song (banshee)
+alias(wnp) 
+{
+	exec("banshee --query-title --query-artist --query-album > /tmp/wnp") {};
+	timer -s (wnptimer,1000) {
+		%wm = $file.readlines("/tmp/wnp");
+		%title = $str.replace("%wm[0]","","title: ");
+		%artist = $str.replace("%wm[1]","","artist: ");
+		%album = $str.replace("%wm[2]","","album: ");
+		if (%wm == $null) 
+		{
+			dialog.message("Error","The variable containing the current playing song is empty. Please try again. If this dialog still appears, look at <b>/tmp/wnp</b>. Also check if banshee is running.<br> Die Variable, welche den aktuell spielenden Song enthält, ist anscheinend leer. Bitte führe den Befehl erneut aus. Wenn diese Meldung erneut erscheint, überprüfe die Datei <b>/tmp/wnp</b> und sieh nach, ob banshee läuft.",223,"OK") {};
+		}
+		else {
+			say "$k(05)Now playing: $k(04)%title$k(05) by$k(04) %artist$k(05) on $k(04)%album";
+		}
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/wnpR.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,15 @@
+# Current playing song
+alias(wnp) 
+{
+	exec("rhythmbox-client --print-playing-format $char(34)$char(92)$char(34)$char(37)tt$char(92)$char(34) by $char(92)$char(34)$char(37)ta$char(92)$char(34) from $char(92)$char(34)$char(37)at$char(92)$char(34)  $char(91)$char(37)te$char(47)$char(37)td$char(93)$char(34) ") 
+	{ 
+		if ($1 == $null)
+		{
+			dialog.message("Error","The variable containing the current playing song is empty. Is Rhythmbox running?<br> Die Variable, welche den aktuell spielenden Song enthält, ist leer. Läuft Rhythmbox?",223,"OK") {};
+		}
+		else 
+		{
+			say "$k(5)Now playing:$k(4) $1"; 
+		}
+	};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils/installer.kvs	Mon Sep 28 20:45:25 2009 +0200
@@ -0,0 +1,169 @@
+/*
+	 A helper class for installing and parsing files,
+	 and generating an uninstallation alias on the fly.
+
+	Example :
+		include "utils/installer.kvs"
+		%installer = $new(installer,0,myinstaller)
+		%installer->$copyFiles(pics,*.png,$file.localdir(pics))
+		%installer->$includeFiles(src,*.kvs)
+		%installer->generateUninstallAlias("foo::uninstall")
+		delete %installer
+	Here, "foo::uninstall" must be called in you uninstall
+	callback script.
+
+	Warnings:
+		1) Declaration of aliases, popups, etc, in source files
+		(.kvs) must be in a similar format
+		as when you export them directly from kvirc.
+		Example:
+			alias(myalias)
+			defpopup(mypopup)
+		2) If you use a "defpopup -m" to add an item to an
+		existing popup,this item won't be registered
+		automatically for uninstallation by this installer script.
+		You should typically identify the item you added using
+		the "id" parameter. See this example where the id is
+		"myaddon::myitem":
+			defpopup -m (channeltextview)
+			{
+				item(MyItem)(myaddon::myitem)
+				{
+					...
+				}
+			}
+		Then, you add this line to you uninstall callback
+		script:
+			delpopupitem channeltextview myaddon::myitem
+*/
+class(installer,object)
+{
+	constructor()
+	{
+	}
+
+	copyFiles($0 = source dir,$1 = file regexp,$2 = target dir)
+	{
+		if(!$file.exists($0))return
+		if($isempty($0))
+		{
+			echo $tr("[Installer] The first argument to \%installer->\$copyfiles must be a source directory")
+			halt
+		}
+
+		if($isempty($1))
+		{
+			echo $tr("[Installer] The second argument to \%installer->\$copyfiles must be a file name or file regexp")
+			halt
+		}
+
+		if($isempty($2))
+		{
+			echo $tr("[Installer] The third argument to \%installer->\$copyfiles must be a destination directory")
+			halt
+		}
+
+		if($file.exists($0))
+		{
+			%files = $file.ls($file.fixpath($0),f,$1)
+			if($length(%files))
+			{
+				@$mkdir($2)
+				foreach(%file,%files)
+				{
+					$this->%lFiles <+ $str.replace($file.fixpath("$2/%file"),"\\\\","\\")
+					file.copy -o $file.fixpath($0/%file) $file.fixpath($2/%file)
+				}
+			}
+		}
+	}
+
+	// Recursive creation of directory
+	mkdir($0 = directory)
+	{
+		if($isempty($0) || $file.exists($0)) return
+		foreach -a (%subdir,$str.split("/",$file.fixpath($0)))
+		{
+			%p <+ %subdir
+			%path = $str.join("/",%p)
+			if(!$file.exists(%path))
+				file.mkdir -q %path
+		}
+		if(!$file.exists($0))
+		{
+			echo $tr("[Installer] Failed to create directory") \"$0\"
+			return
+		}
+	}
+
+	// Parse source files and get what will need to be uninstalled
+	includeFiles($0 = dir, $1 = file regexp)
+	{
+		if($isempty($0))
+		{
+			echo $tr("[Installer] The first argument to \%installer->\$includefiles must be a source directory")
+			halt
+		}
+
+		@$mkdir($0)
+
+		if($1 == "")
+			%szRe = "*.kvs"
+		else
+			%szRe = $1
+
+		%files = $file.ls($file.fixpath($0),f,$1)
+		if($length(%files))
+		{
+			foreach(%file,%files)
+			{
+				$this->%lSources <+ $str.replace($file.fixpath("$0/%file"),"\\\\","\\")
+				include $file.fixpath("$0/%file")
+			}
+		}
+	}
+
+
+	generateUninstallAlias($0 = alias name)
+	{
+		%c  = "alias($0)$lf"
+		%c .= "{$lf"
+		if($isset($this->%lFiles))
+		{
+			foreach(%file,$this->%lFiles)
+			{
+				%file =~ s/"^$file.localdir()/(.*)$"/"\$file.localdir(\\1)"/
+				%c .= "	file.remove -q \"%file\"$lf";
+			}
+		}
+		if($isset($this->%lSources))
+		{
+			foreach(%file,$this->%lSources){
+				foreach(%line,$file.readlines(%file))
+				if(!$str.isempty(%line)){
+					if($str.match("event(*)",%line,e))
+						%c .= "	event -q ("$str.token(1,"()",%line)"){}$lf"
+					else if($str.match("alias(*)",%line,e))
+						%aliases<+$str.token(1,"()",%line)
+					else if($str.match("defpopup(*)",%line,e))
+						%c .= "	defpopup("$str.token(1,"()",%line)"){}$lf"
+					else if($str.match("toolbar.create * *",%line,e))
+						%c .= "	toolbar.destroy -q "$str.word(1,%line)"$lf"
+					else if($str.match("action.create* (*)",%line,e))
+						%c .= "	action.destroy -q "$str.replace($str.token(1,"(,)",%line),,\")"$lf"
+					else if($str.match("class(*)*",%line,e))
+						%c .= "	objects.killclass -q "$str.token(1,"(,)",%line)"$lf"
+				}
+			}
+			if($isset(%aliases))
+				foreach(%alias,%aliases)
+					%c .= "	alias -q (%alias){}$lf"
+			%c .= "	alias -q ($0){}$lf"
+		}
+		%c .= "}"
+		eval %c
+	}
+}
+
+
+