<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>U-Labs Community - Tutorials</title>
		<link>https://u-labs.de/forum/</link>
		<description />
		<language>de</language>
		<lastBuildDate>Fri, 01 May 2026 11:23:23 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>1</ttl>
		<image>
			<url>https://u-labs.de/forum/images/ulabs/misc/rss.png</url>
			<title>U-Labs Community - Tutorials</title>
			<link>https://u-labs.de/forum/</link>
		</image>
		<item>
			<title>Suche jemanden  der mir hilft das login vom Emulator hin zu bekommen</title>
			<link>tutorials-90/suche-jemanden-der-mir-hilft-das-login-vom-emulator-hin-zu-bekommen-41518?goto=newpost</link>
			<pubDate>Sat, 07 Sep 2024 13:56:40 GMT</pubDate>
			<description>Hallo suche jemanden der mir denn Emulator starten kann  
Würde auch was bezahlen</description>
			<content:encoded><![CDATA[<div>Hallo suche jemanden der mir denn Emulator starten kann <br />
Würde auch was bezahlen</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>Artemde96</dc:creator>
			<guid isPermaLink="true">tutorials-90/suche-jemanden-der-mir-hilft-das-login-vom-emulator-hin-zu-bekommen-41518</guid>
		</item>
		<item>
			<title>Easy Logger selbst erstellt (eclipse)</title>
			<link>tutorials-90/easy-logger-selbst-erstellt-eclipse-40326?goto=newpost</link>
			<pubDate>Sun, 01 Nov 2020 18:11:11 GMT</pubDate>
			<description>Hier mal ein simples Tutorial, wie man einen wirklich einfachen Logger auf Basis der Standalone-App erstellt. 
 
*1. *Erstelle ein Java-Projekt 
...</description>
			<content:encoded><![CDATA[<div>Hier mal ein simples Tutorial, wie man einen wirklich einfachen Logger auf Basis der Standalone-App erstellt.<br />
<br />
<b>1. </b>Erstelle ein Java-Projekt<br />
<br />
<b>2. </b>Erstelle ein <b>libs </b>Ordner<br />
<br />
<b>3. </b>Kopiere die StApp in den <b>libs </b>Ordner und füge alle .jar-Files zum Build-Path des Projektes hinzu<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">&nbsp; &nbsp; &nbsp; C:\Users\&lt;User&gt;\Knuddels-Stapp\bXXXXX\ &gt; /libs/</code><hr />
</div><b>4.</b> Erstelle eine simple Logger-Klasse mit Start-Methode:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJava.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: java;">
<br />
public class KnuddelsLogger extends base.GroupChatStandalone {<br />
	public KnuddelsLogger(String&#91;&#93; arg0, String arg1, int arg2) {<br />
		super(arg0, arg1, arg2);<br />
	}	    <br />
<br />
	public static void main(String&#91;&#93; args) {<br />
		new KnuddelsLogger(args, null, args.length);<br />
	}<br />
}<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Die Klasse muss von <b>base.GroupChatStandalone</b> erben.<br />
Im prinzip kann die StApp nun bereits gestartet werden.<br />
<br />
Da wir aber die Pakete mitloggen möchten, müssen wir eine Methode suchen und auch überschreiben. Um die Pakete, die empfangen suchen wir in der Superklasse eine Methode, die folgendes Schema besitzt:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Zitat:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			public boolean &lt;NAME&gt;(String X)
			
		<hr />
	</div>
</div>Da es einige wenige Methoden gibt, die diesem Schema entsprechen, müssen wir einfach herumprobieren und in unserer Logger-Klasse die Methode einfach überschreiben:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJava.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: java;">
<br />
	@Override<br />
	public boolean tx(String a) {<br />
		return super.tx(a);<br />
        }<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Um nun mitzuloggen, müssen wir nur das ganze ausgeben:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJava.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: java;">
<br />
	@Override<br />
	public boolean tx(String a) {<br />
                System.out.println(&quot;&#91;SEND&#93; &quot; + a);<br />
		return super.tx(a);<br />
        }<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Für Profis unter uns können wir das ganze nun noch etwas &quot;formatieren&quot;, damit man die Tokens besser sieht - Hierzu benutze ich das mitgelieferte JSON:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJava.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: java;">
<br />
	@Override<br />
	public boolean tx(String a) {<br />
    	JSONArray j = new JSONArray();<br />
    	<br />
    	String&#91;&#93; tokens = a.split(&quot;\0&quot;);<br />
    	for (int i = 0; i &lt; tokens.length; i++) {<br />
            j.add(tokens&#91;i&#93;);<br />
         }<br />
    	System.err.println(&quot;\n\tSEND: &quot; + JSONArray.toJSONString(j));<br />
    	<br />
		return super.tx(a);<br />
    }<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Voilá, fast fertig!<br />
Das ganze müssen wir nun auch beim Receiver machen. Da sucht man sich nur die Methode, wo StringTokenizer verwendet werden.<br />
<br />
Und so schaut das ganze dann aus:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Zitat:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			[...]<br />
ServerSetting changed [chat.knuddels.de:2710/80 =&gt; DE]<br />
JX Starting Browser-Prewarm ...<br />
Connecting to server ...<br />
Using Normal Socket<br />
No version file detected: C:\Users\************\eclipse-workspace\Knuddels Billard-Debug\inst.version<br />
<br />
	SEND: [&quot;t&quot;,&quot;V9.0cab &quot;,&quot;https:\/\/www.knuddels.de\/STAPP-null&quot;,&quot;14&quot;,&quot;14.0.2 (64bit)&quot;,&quot;-&quot;,&quot;62150&quot;,&quot;OpenJDK 64-Bit Server VM&quot;,&quot;****************&quot;,&quot;4076&quot;,&quot;Oracle Corporation&quot;,&quot;Windows 10 64bit)&quot;,&quot;standalone&quot;,&quot;********&quot;,&quot;*****************  *******&quot;]<br />
Connection try returned [0] Elapsed: 1462<br />
UPDATED Protocol 85037142 - 01.11.2020, 18:47:14<br />
JX-B1 Created new browser view. browserType: JX/HEAVYWEIGHT/persistent, appId: BrowserPrewarm<br />
JX Browser-Prewarm DONE: 675ms<br />
<br />
	SEND: [&quot;k&quot;,&quot;**&quot;,&quot;0&quot;,&quot;**********&quot;,&quot;***********************  ***********&quot;]<br />
CONFIRMED Protocol 85037142 - 01.11.2020, 18:47:14<br />
[...]
			
		<hr />
	</div>
</div>Das ganze wurde getestet mit der Version V9.0cab. <br />
<br />
<b>Extended - Billard Logger</b><br />
Hierzu gehen wir in den <b>lib</b> Ordner und öffnen die <b>main.jar</b> mit WinRAR (oder einem ZIP-Programm). Hier löschen wir die <b>BillardManager.class</b>. Zieht die vorher am besten auf den Desktop und decompiliert sie, um die BillardGame-Klasse zu extrahieren.<br />
<br />
Wir erstellen nun im Java-Projekt eine BillardManager-Klasse und erweitern (wie beim Original) die BillardGame-Klasse:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJava.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: java;">
<br />
public class BillardManager extends cyz {<br />
<br />
}<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Wir folgen der BillardGame-Klasse (cyz) und finden das Interface für das Modul-System (onRecieve, destroy, regsiterModule). Hier überschreiben wir nun die Methoden:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJava.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: java;">
<br />
public class BillardManager extends cyz {<br />
// onReceive<br />
     @Override<br />
	public void j(final StringTokenizer stringTokenizer) {<br />
        JSONArray j = new JSONArray();<br />
    	StringBuffer b = new StringBuffer();<br />
    	<br />
        while(stringTokenizer.hasMoreTokens()) {<br />
        	String e = (String) stringTokenizer.nextElement();<br />
            j.add(e);<br />
            b.append(e);<br />
            b.append(&quot;\0&quot;);<br />
         }<br />
    	System.err.println(&quot;\n\tRECEIVE: &quot; + JSONArray.toJSONString(j));<br />
<br />
        super.j(new StringTokenizer(b.toString(), &quot;\0&quot;));<br />
    }<br />
    <br />
// send<br />
    public void a(String tokens) {<br />
    	this.z.tx(tokens);<br />
    }<br />
    <br />
// load Image<br />
    @Override<br />
	public _q r(String paramString) {<br />
    	System.out.println(&quot;\n\tLoad Image: &quot; + paramString);<br />
        return super.r(paramString);<br />
   }<br />
}<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
<br />
P.S. Falls eclipse oder Java wegen irgendwelchen Security-Gedönse meckert, löscht einfach in allen .jar files die MANIFEST!<br />
Diese enthält nämlich Fingerprints des Builds.</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>Bubble Gum</dc:creator>
			<guid isPermaLink="true">tutorials-90/easy-logger-selbst-erstellt-eclipse-40326</guid>
		</item>
		<item>
			<title><![CDATA[[Knoxy] Wir Programmieren einen Knuddels-Proxy!]]></title>
			<link>tutorials-90/knoxy-wir-programmieren-einen-knuddels-proxy-39821?goto=newpost</link>
			<pubDate>Sun, 10 Jun 2018 11:32:46 GMT</pubDate>
			<description>Ich habe mir mal gedacht, ein wenig Langeweile zu vertreiben :D 
 
*Vorwort* 
Ich bin alleiniger Autor der Tutorial-Serie. Es ist mehrfach bereits...</description>
			<content:encoded><![CDATA[<div>Ich habe mir mal gedacht, ein wenig Langeweile zu vertreiben :D<br />
<br />
<b>Vorwort</b><br />
Ich bin alleiniger Autor der Tutorial-Serie. Es ist mehrfach bereits vorgekommen, dass solche Beiträge von mir woanders via Copy&amp;Paste publiziert wurden. Das Tutorial ist ausschließlich hier für U-Labs gedacht und ich möchte es nicht auf Banana-Coding oder sonstige Plattformen sehen! Andernfalls werde ich nie wieder etwas für die breite Öffentlichkeit publizieren, obwohl ihr davon selbst profitieren könntet.<br />
<br />
<b>Basics</b><br />
Natürlich musst du mindestens ein wenig Verständnis aufweisen. Es nützt nicht viel, wenn man am Ende des Tutorials die &quot;Vorgehensweise&quot; nicht versteht. Man muss kein perfekter Programmierer/Scripter sein, die Hauptsache ist, dass du ein Verständnis dafür aufbringst, wie die Software abläuft und was diese überhaupt tut. Seit Jahren habe ich schon immer das selbe Zitat, was ich mir selbst ausgedacht habe:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Zitat:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			Der Weg zum Erfolg ist die Logik, nicht die Funktionsnamen zu kennen - Bizzi
			
		<hr />
	</div>
</div>Fangen wir auch nun direkt einmal mit dem wesentlichen an: Was verwenden wir überhaupt?<br />
Da war ich mir etwas unschlüssig, da es mehr als eine Option gab.<br />
<br />
Wir möchten auf jeden Fall ein Zwischending zwischen Bot und Analyse-Tool schaffen; Eine direkte Manipulation vom Clienten war keine Option, da man hier dauernd damit beschäftigt ist, neue Versionen zu fixen. Es blieb also nur eine Art Proxy, die sich zwischen Clienten und Server einspeist und die Daten abfängt.<br />
<br />
Die zweite Frage, die sich einem stellt, welche Programmier- oder Scriptsprache wir verwenden. Ich bin kein großer Fan von C++, der Aufwand wäre hier viel zu Groß. C# wäre hier zwar eine Alternative, habe mich aber auch hier gegen entschieden, da ich mehr Richtung Plattformübergreifung gehen möchte. Java ist hier zwar auch eine Alternative, bin aber mittlerweile weniger damit beschäftigt, selbst JFX reizt mich nicht mehr so dolle. Die beste Alternative bietet hier <a href="https://nodejs.org/en/" target="_blank" rel="nofollow">Node.js</a>. Ich meine, es ist JavaScript; Nicht ganz so strikt, bietet enorm einfache Möglichkeiten, mit nur wenigen Handgriffen etwas auf die Beine zu stellen, und es ist verständlich. Außerdem gibt es genügend, die sich vielleicht mal mit JavaScript befasst haben, auch wenn nur für Webseiten.<br />
<br />
Wir nehmen hier kein plain <a href="https://nodejs.org/en/" target="_blank" rel="nofollow">Node.js</a>, sondern verwenden <a href="https://electronjs.org/" target="_blank" rel="nofollow">electron</a>, da wir hier eine Applikation schaffen wollen, die auch eine UI anbietet. Schließlich wollen wir später mit diversen Popups/UI-Elementen das bedienen des Proxys vereinfachen.<br />
<br />
Vorweg: wir müssen <a href="https://nodejs.org/en/" target="_blank" rel="nofollow">Node.js</a> bereits installiert haben. Benutze bitte nicht die LTS-Version, sondern eine über Version 9, zum Beispiel 10.4.0.<br />
<br />
<b>Die initiale Applikation</b><br />
Wir starten mit der Basis. Wir legen uns ein Verzeichnis an (ich habe es als Beispiel &quot;Knoxy&quot; genannt) und erstellen hier unsere <b>package.json</b>, <b>main.js</b> und lassen dann die aktuellste Version von electron installieren:<br />
<br />
<b>package.json</b><br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJScript.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: js;">
{<br />
	&quot;name&quot;: &quot;knoxy&quot;,<br />
	&quot;version&quot;: &quot;1.0.0&quot;,<br />
	&quot;main&quot;: &quot;main.js&quot;,<br />
	&quot;scripts&quot;: {<br />
		&quot;start&quot;: &quot;electron .&quot;<br />
	}<br />
}<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
<b>main.js</b><br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJScript.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: js;">
console.log('Hello World');
</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Zitat:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			npm i -D electron@latest
			
		<hr />
	</div>
</div>Bei der Installation wird in der <b>package.json</b> die Abhängigkeit für electron hinzugefügt und ein <b>node_modules</b> Ordner erstellt.<br />
<br />
<b>Der erste Proxy</b><br />
Die Basist steht. Jetzt erstellen wir uns den Ordner <b>classes </b>und legen dort die Datei <b>Proxy.class.js</b> mit folgenden Inhalt an:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJScript.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: js;">
<br />
var Network = require('net');<br />
<br />
module.exports = function Proxy() {<br />
	this.__constructor = function __constructor() {<br />
		// Startet einen TCP-Server auf Port 2710, hier verbindet sich der Client drauf...<br />
		Network.createServer({<br />
			allowHalfOpen: true<br />
		}, function(socket) {<br />
			var client;<br />
			// Hier wird die Verbindung zu Knuddels aufgebaut<br />
			client = Network.createConnection(2710, 'chat.knuddels.de');<br />
			// Die Verbindung wird &quot;gepiped&quot;, sprich, die Daten werden Bi-Direktional direkt zwischen Client und Server &quot;hin und her&quot; geschoben<br />
			socket.pipe(client).pipe(socket);<br />
			<br />
			// Wenn der Client Daten sendet, geben wir diese aus<br />
			socket.on('data', function onRequest(data) {<br />
				console.log('&#91;Server&#93;', data.toString());<br />
			});<br />
			<br />
			// Wenn der ChatServer Daten sendet,...<br />
			client.on('data', function onRequest(data) {<br />
				console.log('&#91;Client&#93;', data.toString());<br />
			});<br />
<br />
			socket.on('error', function onError(error) {<br />
				console.log('Error: ' + error.soString());<br />
			});<br />
		}).listen(2710);<br />
	};<br />
	<br />
	this.__constructor();<br />
};<br />

</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Natürlich müssen wir unsere <b>main.js</b> nun noch anpassen, um die Proxy-Class zu initialisieren:<br />
<script type="text/javascript" src="clientscript/syntaxhighlighter/shCore.js"></script>
<script type="text/javascript" src="clientscript/syntaxhighlighter/shBrushJScript.js"></script>
<link type="text/css" rel="stylesheet" href="clientscript/syntaxhighlighter/styles/shCoreDefault.css"/>

<pre class="brush: js;">
const { app, BrowserWindow } = require('electron');<br />
const Proxy = require('./classes/Proxy.class.js');<br />
<br />
const Main = (new function Main() {<br />
	this.__constructor = function __constructor() {<br />
		// Wenn electron-API bereit, dann starten wir unseren Proxy....<br />
		app.on('ready', function onReady() {<br />
			new Proxy();<br />
		});<br />
	};<br />
	<br />
	this.__constructor();<br />
}());
</pre>
<script type="text/javascript">
SyntaxHighlighter.config.stripBrs = true;
SyntaxHighlighter.all();
</script><br />
<br />
Voila! Wir sind fertig. Mit <b>npm start</b> können wir die Applikation nun starten! Bis jetzt wirst du dann ausschließlich kryptische Daten wie diese hier sehen:<br />
<img src="https://u-img.net/img/4616Qf.jpg" border="0" alt="" /><br />
<br />
<b>Der Client</b><br />
Wir nutzen hier Standardmäßig die Knuddels StApp, sprich die Standalone-Version.<br />
Um mit dem Clienten auf unseren Proxy verbinden zu können, legst du am besten einfach eine neue Verknüpfung an und modifizierst die Parameter, dass dieser mit dem Proxy verbindet:<br />
<br />
<img src="https://u-img.net/img/6616Zj.jpg" border="0" alt="" /><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Zitat:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			C:\Users\&lt;WindowsNutzer&gt;\Knuddels-Stapp\CommonFiles\Java\bin\javaw.exe -noverify -client -jar kjupdate.jar <b>localhost 2710</b>
			
		<hr />
	</div>
</div>Im nächsten Tutorial werden wir den Proxy erweitern um das ChatProtokoll zu lesen, schließlich soll das ganze auch in einer UI angezeigt werden.</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>Bubble Gum</dc:creator>
			<guid isPermaLink="true">tutorials-90/knoxy-wir-programmieren-einen-knuddels-proxy-39821</guid>
		</item>
		<item>
			<title>HOWTO: Knuddels Android APP in Virtual Box rooten</title>
			<link>tutorials-90/howto-knuddels-android-app-in-virtual-box-rooten-20490?goto=newpost</link>
			<pubDate>Thu, 07 Feb 2013 20:49:45 GMT</pubDate>
			<description>Neue Virtuelle Maschine in Virtual Box anlegen und mit folgender ISO Installieren:...</description>
			<content:encoded><![CDATA[<div>Neue Virtuelle Maschine in Virtual Box anlegen und mit folgender ISO Installieren:<br />
<a href="http://code.google.com/p/android-x86/downloads/detail?name=android-x86-3.2-RC2-eeepc.iso&amp;can=2&amp;q=" target="_blank" rel="nofollow">http://code.google.com/p/android-x86...c.iso&amp;can=2&amp;q=</a><br />
<br />
<br />
Deaktiviert die Zeigerintegration in der Maschine.<br />
Setzt Netzwerkkarte in den Virtual Box Einstellungen auf Bridged Adapter.<br />
<br />
<br />
Nach der Installation:<br />
ALT+F1 um in shell zu kommen.<br />
<br />
dort mit <br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ifconfig eth0 XXX.XXX.XXX.XXX netmask 255.255.255.0 up</code><hr />
</div>Die Netzwerkkarte installieren.<br />
XXX.XXX.XXX.XXX mit einer freien IP in eurem Netzwerk ersetzen.<br />
<br />
Danach vom Host PC per ADB auf die VM verbinden und die APK installieren.<br />
<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">adb connect XXX.XXX.XXX.XXX<br />
adb install knuddels.apk</code><hr />
</div><br />
Anschließend verändert ihr die hosts Datei auf der Maschine.<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">vi /etc/hosts</code><hr />
</div> &lt;&lt;&lt; da bei mir das System auf /system/ gemountet ist, ist es bei mir vi /system/etc/hosts<br />
<br />
<br />
Dort fügt ihr die neue Zeile für chat.knuddels.de ein, die auf euren lokalen Rechner verweist.<br />
<br />
<br />
<br />
<br />
WICHTIG:<br />
Das richtet sich an Entwickler, wer keine Ahnung davon hat lässt es am besten bleiben. Ein Tool zum Loggen gibt es wohl noch nicht, da anscheinend die APP ein anderes Protokoll nutzt.<br />
Mehr Infos gibt es hier:<br />
<a href="http://u-hacks.net/ressourcen-92/knuddels-android-app-20426/" target="_blank" rel="nofollow">http://u-hacks.net/ressourcen-92/knu...oid-app-20426/</a></div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>AlbionHack</dc:creator>
			<guid isPermaLink="true">tutorials-90/howto-knuddels-android-app-in-virtual-box-rooten-20490</guid>
		</item>
		<item>
			<title><![CDATA[[Übersicht] Tutorials zur Knuddels-Entwicklung]]></title>
			<link>tutorials-90/uebersicht-tutorials-zur-knuddels-entwicklung-12983?goto=newpost</link>
			<pubDate>Thu, 31 May 2012 21:53:18 GMT</pubDate>
			<description>Da es mittlerweile einige Tutorialserien gibt und gerade für Neulinge nicht immer ersichtlich ist welche zusammengehören, gibt es hier eine kleine...</description>
			<content:encoded><![CDATA[<div>Da es mittlerweile einige Tutorialserien gibt und gerade für Neulinge nicht immer ersichtlich ist welche zusammengehören, gibt es hier eine kleine Übersicht. <br />
<font size="3"><b><br />
Tutoral-Reihen:</b></font><br />
<br />
<b>Paper-Reihe</b><br />
Komplette Client-Entwicklung von den Grundlagen bis hin zur Manipulation des Clienten<br />
Sprache: Allgemein/Java<br />
Author: <a href="http://u-hacks.net/members/dmw007-18/" target="_blank" rel="nofollow"><font color="#e21ee2">DMW007</font></a><br />
<br />
<a href="http://u-hacks.net/tutorials-90/paper-1-erster-einstieg-die-knuddels-programmierung-8629/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/pape...mmierung-8629/</a><br />
<a href="http://u-hacks.net/tutorials-90/paper-2-zugriff-auf-den-knuddelsclient-aus-java-heraus-12977/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/pape...-heraus-12977/</a><br />
<a href="http://u-hacks.net/tutorials-90/paper-3-saubere-struktur-bei-der-entwicklung-12982/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/pape...icklung-12982/</a><br />
<br />
<b>Client Programmierung-Reihe</b><br />
Grundlagen der Client-Entwicklung bis zum ersten Bot der auf einem selbst manipulierten Client basiert, geht auch auf die nicht sichtbaren Vorgänge ein (z.B. wie Java compiliert bzw der decompiler decompiliert)<br />
Sprache: Java<br />
Author: MiBo<br />
<br />
<a href="http://u-hacks.net/tutorials-90/client-programmierung-teil-i-die-grundlagen-136/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/clie...rundlagen-136/</a><br />
<a href="http://u-hacks.net/tutorials-90/client-programmierung-teil-ii-der-anfang-138/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/clie...er-anfang-138/</a><br />
<a href="http://u-hacks.net/tutorials-90/client-programmierung-teil-iii-unser-erster-bot-156/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/clie...rster-bot-156/</a><br />
<br />
<b>Tutorial-Reihe</b><br />
Verschiedene Schwerpunkte<br />
Sprache: VB.NET<br />
Author: <a href="http://u-hacks.net/members/nico-67/" target="_blank" rel="nofollow">Nico</a><br />
<br />
<a href="http://u-hacks.net/tutorials-90/tutorial-1-bot-programmieren-vbulletin-net-619/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/tuto...letin-net-619/</a><br />
<a href="http://u-hacks.net/tutorials-90/tutorial-2-userlist-einfaerben-650/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/tuto...infaerben-650/</a><br />
<a href="http://u-hacks.net/tutorials-90/tutorial-3-chatverlauf-1233/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/tuto...tverlauf-1233/</a><br />
<br />
<font size="3"><b>Einzelne Tutorials:</b></font><br />
<br />
<b>HowTo zur Programmierung eines Quizbots</b><br />
Sprache: VB.NET<br />
Author: <a href="http://u-hacks.net/members/uncopyable-85/" target="_blank" rel="nofollow"><font color="#fbed4c">uncopyable</font></a><br />
<a href="http://u-hacks.net/tutorials-90/how-quizbot-vbulletin-4939/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/how-...bulletin-4939/</a><br />
<br />
Wenn ein neues Tutorial dazugekommen ist das hier noch nicht dabei ist, per PN melden oder reporten.</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>DMW007</dc:creator>
			<guid isPermaLink="true">tutorials-90/uebersicht-tutorials-zur-knuddels-entwicklung-12983</guid>
		</item>
		<item>
			<title><![CDATA[[Paper #3] Saubere Struktur bei der Entwicklung]]></title>
			<link>tutorials-90/paper-3-saubere-struktur-bei-der-entwicklung-12982?goto=newpost</link>
			<pubDate>Thu, 31 May 2012 21:25:30 GMT</pubDate>
			<description>*Vorwort* 
 
In Teil #3 (http://u-hacks.net/tutorials-90/paper-2-zugriff-auf-den-knuddelsclient-aus-java-heraus-12977/) habe ich gezeigt, wie man den...</description>
			<content:encoded><![CDATA[<div><b>Vorwort</b><br />
<br />
In Teil #3 (<a href="http://u-hacks.net/tutorials-90/paper-2-zugriff-auf-den-knuddelsclient-aus-java-heraus-12977/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/pape...-heraus-12977/</a>) habe ich gezeigt, wie man den Knuddels-Client aus Java heraus lokal starten kann.<br />
Damit auch Anfänger hier schnell Erfolge erzielen können, habe ich mich auf das wichtigste beschränkt.<br />
So ist z.B. die Verzeichnisstruktur zu kurz gekommen.<br />
Damit es nachher nicht heißt ich würde angehenden Entwicklern empfehlen, auf Übersichtlichkeit zu scheißen und einfach alles in einen Ordner zu knallen, zeige ich euch hier die Grundstruktur eines übersichtlichen Clienten. <br />
<br />
<img src="http://u-img.net/img/3102Oa.png" border="0" alt="" /><br />
 Um dieses Tutorial komplett zu verstehen, ist Grundwissen in Batch erforderlich. <br />
<br />
<b>1. Ordner anlegen</b><br />
<br />
Wie zuvor legen wir erstmal einen Ordner für alles was mit dem Client zutun hat an. Idealerweise nennen wir diesen <b>Client</b>.<br />
<br />
In diesem Ordner erstellen wir nun einige neue Unterordner: <br />
<br />
<b>src</b><br />
src ist die Abkürzung für source bzw sourcecode. In diesen Ordner kommen alle selbst geschriebenen Klassen des Clienten sowie später unsere Manipulator-Klasse. <br />
<br />
<b>lib</b><br />
In den lib-Ordner kommen sämtliche <b>lib</b>raries, die wir nutzen (Applet, ani-Archiv usw). <br />
<br />
<b>dist</b><br />
Der <b>dist</b>ribute-Ordner enthält nachher unseren fertigen Client, der in dieser Form weitergegeben werden kann (distribute = verteilen).<br />
<br />
Man kann die Ordner natürlich auch anders nennen, wenn man diese Umbenennung(en) später im Tutorial berücksichtigt.<br />
Die Namen der Ordner sind so gewählt, dass sie möglichst kurz sind, aber dennoch auf ihren Inhalt schließen lassen (sonst könnte man die Ordner auch einfach a, b und c nennen).<br />
Dies ist für Coder optimal, da coder normal faul sind und daher natürlich nicht jedesmal wenn sie diese Ordner verwenden Romane schreiben möchten.<br />
<br />
<b>2. Dateien in die Ordner verschieben<br />
</b><br />
Aus obiger Erklärung kann man sich eigentlich schon denken was wo hineingehört, damit es aber auch dem letzten Klar ist hier nochmal die komplette Verzeichnisstruktur:<br />
<br />
Client<br />
--src<br />
----Client.java<br />
--lib<br />
----knuddelsk90amz.jar<br />
----ani90amz.jar<br />
----netscape<br />
--dist<br />
<br />
<b>3. Script + Mainfest erstellen</b><br />
<br />
Da wir das ganze nun etwas sauberer und professioneller angehen wollen, erstellen wir uns getrennte Scripte fürs starten und compilieren. <br />
Bei dem alten Script wird jedesmal alles compiliert, was natürlich unsinnig ist, wenn man den Client nur starten will. <br />
<br />
Bevor wir ein Script erstellen, erstellen wir erstmal eine sogenannte Mainfest-Datei. Diese Datei gibt Beispielsweise an, welches die Startklasse ist, die beim Doppelklick auf das Jar-Archiv gestartet werden soll. <br />
<br />
Dazu erstellen wir im Ordner Client eine neue Textdatei namens 'mainfest'. <br />
In dieser Datei legen wir die Startklasse fest:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">Main-Class: Client</code><hr />
</div>Anschließend sollte eine Leerzeile folgen (also einfach 1x Enter drücken) - nun noch abspeichern und fertig. <br />
<br />
Jetzt erstellen wir die Batchdatei, die alles komplett neu kompiliert. Passend dazu nennen wir sie <b>compile.bat</b>.<br />
<br />
Am Anfang der Datei definineren wir einige Variablen:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">@set version=90alw<br />
@set cp=lib\knuddelsk%version%.jar;.<br />
@set out=Client%version%</code><hr />
</div>Das @ am Anfang bedeutet, dass der Befehl nicht auf der Konsole ausgegeben wird, was hier nicht notwendig ist und nur die Übersicht stören würde.<br />
<br />
<b>version</b> gibt die Appletversion an. Bei einem Appletupdate müssen wir die Version so nur an dieser einen Stelle ändern und nicht an 10 weiteren. <br />
<br />
<b>cp</b> ist der ClassPool von Java. Hier gehören alle Libs rein die wir nutzen und die Java braucht, um alles fehlerfrei zu kompilieren. <br />
Im Moment ist das nur das Applet, es werden aber später auf jeden Fall noch weitere dazukommen. <br />
<br />
<b>out</b> ist der Name der Jar-Datei, die später unser fertiger Client im Ordner dist tragen wird. <br />
<br />
Es empfiehlt sich, zuvor compilierte class-Dateien aus dem src-Ordner zu löschen, bevor man sie neu compiliert. Ist nicht zwingend notwendig, aber beugt Fehlern vor:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">del src\*.class</code><hr />
</div>* ist ein regulärer Ausdruck und auch als Joker-Zeichen bekannt. *.class bedeutet einfach alle Dateien mit der Dateiendung .class. <br />
<br />
Nun compilieren wir alle java-Dateien im src-Ordner. Im moment ist das zwar nur eine, das wird sich aber später noch ändern, wenn man sauber objektorientiert programmiert. <br />
<br />
Daher nutzen wir auch hier das Joker-Zeichen und kompilieren alle Java-Dateien auf einen Schlag. Da sich das Knuddels-Applet aus übersichtlichkeitsgründen in einem anderen Ordner befindet, übergeben wir java dies als ClassPool.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">javac -cp %cp% src\*.java</code><hr />
</div>Im Ordner <b>dist</b> legen wir einen neuen Ordner <b>temp</b> an und wechseln in diesen.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">cd dist<br />
mkdir tmp &amp;&amp; cd tmp</code><hr />
</div>Den Ordner brauchen wir, weil nun dasselbe passiert wie in #2: Alles wird in einen Ordner geklatscht. <br />
Der Unterschied ist nur, dass dies nur für das Jar-Archiv gemacht wird und wir davon nichts mitbekommen. Unsere Dateien sind und bleiben zum coden schön ordentlich in getrennten Ordnern. <br />
<br />
Wir kopieren also erstmal alle compilierten Klassen in unseren Temp-Ordner<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">xcopy ..\..\src\*.class . /Y</code><hr />
</div>Dasselbe machen wir mit dem Applet und dem ani-Archiv, das wir allerdings nicht kopieren, sondern in diesen Ordner entpacken<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">jar xf ..\..\lib\knuddelsk%version%.jar<br />
jar xf ..\..\lib\ani%version%.jar</code><hr />
</div>Der netscape-Ordner darf natürlich auch nicht vergesen werden:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">md netscape<br />
xcopy ..\..\lib\netscape\* netscape /S /Y</code><hr />
</div>Da nun alles beisammen ist, erstellen wir aus dem ganzen Kram ein Jar-Archiv mit der zuvor erstellten Mainfest:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">jar cfm ..\..\dist\%out%.jar ..\..\mainfest.txt *</code><hr />
</div>Und der Client ist fertig, alles in einem automatisch startenden Jar-Archiv drin.<br />
<br />
Natürlich muss jemand den ganzen Dreck, den wir im tmp-Ordner gemacht haben auch wieder aufräumen. Das überlassen wir nicht der imaginären Putzfrau, sondern machen es selbst:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">cd ..<br />
rmdir /S /Q tmp</code><hr />
</div>An den Schluss würde ich noch ein<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">pause</code><hr />
</div>setzen, damit wir im Fehlerfall die Fehlermeldung lesen können und sich das Script nicht schließt.<br />
<br />
Das fertige Script sollte nun so aussehen:<br />
<br />
<div style="margin:20px; margin-top:5px">
<div class="smallfont" style="margin-bottom:2px"><b>Spoiler</b>:<input type="button" value="Show" style="width:45px;font-size:10px;margin:0px;padding:0px;" onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = '';        this.innerText = ''; this.value = 'Hide'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Show'; }">
</div>
<div class="alt2" style="margin: 0px; padding: 6px; border: 1px inset;">
<div style="display: none;">
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">@set version=90alw<br />
@set cp=lib\knuddelsk%version%.jar;.<br />
@set out=Client%version%<br />
<br />
del src\*.class<br />
javac -cp %cp% src\*.java<br />
<br />
cd dist<br />
mkdir tmp &amp;&amp; cd tmp<br />
<br />
xcopy ..\..\src\*.class . /Y<br />
jar xf ..\..\lib\knuddelsk%version%.jar<br />
jar xf ..\..\lib\ani%version%.jar<br />
md netscape<br />
xcopy ..\..\lib\netscape\* netscape /S /Y<br />
<br />
jar cfm ..\..\dist\%out%.jar ..\..\mainfest.txt *<br />
cd ..<br />
rmdir /S /Q tmp<br />
<br />
pause</code><hr />
</div>
</div>
</div>
</div><br />
<br />
Der fertige Client befindet sich im Ordner <b>dist</b> und heißt hier <b>ClientClient90alw.jar</b>.<br />
Um ihn zu starten ist kein Startscript nötig, es genügt ein Doppelklick auf die jar-Datei. <br />
<br />
Alternativ kann man ihn natürlich auch über eine Batchdatei mit dem Inhalt<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">java -jar Client90alw.jar</code><hr />
</div>starten.<br />
<br />
Vorteile:<br />
<br />
 <img src="http://u-img.net/img/2002Ov.png" border="0" alt="" /> Übersichtliche Verzeichnisstruktur<br />
 <img src="http://u-img.net/img/2002Ov.png" border="0" alt="" /> Client kann einfacher geupdatet werden<br />
 <img src="http://u-img.net/img/2002Ov.png" border="0" alt="" /> User erhält ein fertiges Jar-Archiv, das per doppelklick startet - keine 99 Sourcefiles die über eine Batch-Datei gestartet werden<br />
<br />
Mehr fällt mir grad nicht ein, sollte aber denke ich reichen, um diese Methode der Chaos-Methode vorzuziehen. <br />
<br />
<img src="http://u-img.net/img/5177Fe.png" border="0" alt="" /><br />
Das nächste Tutorial zur Manipulation des Clienten wird logischerweise auf diesem Tutorial aufbauen und nicht auf #2. <br />
Im Anhang befindet sich der gleiche Client aus Paper #2 mit der hier gezeigten überarbeiteten Verzeichnisstruktur.</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>DMW007</dc:creator>
			<guid isPermaLink="true">tutorials-90/paper-3-saubere-struktur-bei-der-entwicklung-12982</guid>
		</item>
		<item>
			<title><![CDATA[[Paper #2] Zugriff auf den Knuddelsclient aus Java heraus]]></title>
			<link>tutorials-90/paper-2-zugriff-den-knuddelsclient-aus-java-heraus-12977?goto=newpost</link>
			<pubDate>Thu, 31 May 2012 19:53:01 GMT</pubDate>
			<description>*1. Vorwort* 
 
Der Knuddelsclient selbst ist in Java geschrieben. Es liegt also nahe, dass wir Java nutzen, um den Client zu unseren Gunsten zu...</description>
			<content:encoded><![CDATA[<div><b>1. Vorwort</b><br />
<br />
Der Knuddelsclient selbst ist in Java geschrieben. Es liegt also nahe, dass wir Java nutzen, um den Client zu unseren Gunsten zu manipulieren.<br />
Unser Ziel wird es sein, eine Java-Anwendung zu entwickeln, die zwischen dem originalen Knuddels-Client und dem Chatserver steht.<br />
<br />
So kommuniziert der Knuddels-Client normal:<br />
<br />
<img src="http://u-img.net/img/8309Sr.png" border="0" alt="" /><br />
<br />
Da wir diesen Datenverkehr kontrollieren, manipulieren und ggf. auch selbstständig erzeugen wollen, sitzt unsere Java-Anwendung später dazwischen:<br />
<br />
<img src="http://u-img.net/img/5330Kp.png" border="0" alt="" /><br />
<br />
Wenn unser Client ein Paket zum Server senden will (z.B. wenn wir eine Nachricht senden), landet dieses Paket nicht direkt beim Server, sondern erst beim Client.<br />
Haben wir im Client festgelegt, dass dieses Paket okay ist, wird es zum Server weitergeleitet.<br />
Unsere Java-Anwendung stellt also eine Art Brücke zwischen Client und Server da, mit der wir alles kontrollieren können.<br />
<br />
<b>2. Vorbereitungen und Werkzeuge</b><br />
<b><br />
2.1 Java Umgebungsvariablen registrieren<br />
<br />
</b> Dieses Tutorial baut auf dem ersten Teil <a href="http://u-hacks.net/tutorials-90/paper-1-erster-einstieg-die-knuddels-programmierung-8629/" target="_blank" rel="nofollow">http://u-hacks.net/tutorials-90/pape...mmierung-8629/</a> auf.<br />
Ihr solltet also wie dort beschrieben das Java-SDK zusammen mit einem Texteditor eurer Wahl besitzen.<br />
Da wir später Java-Programme konsolenbasiert sowohl ausführen als auch kompilieren werden, müssen die Umgebungsvariablen angepasst werden.<br />
Wie das genau funktioniert, könnt ihr hier nachlesen: <a href="http://www.torsten-horn.de/techdocs/java-install.htm#InstallationUnterWindows" target="_blank" rel="nofollow">Installation des Java SDK / JDK</a> (ab Punkt 8).<br />
<br />
<b>2.2 Knuddels Applet herunterladen</b><br />
<br />
Da wir mit dem Knuddels-Applet arbeiten und es später sogar manipulieren wollen, benötigen wir dies natürlich erst einmal.<br />
Die aktuellste Version bekommen wir relativ einfach von der Knuddels-Homepage, wir müssen dazu nur den Login aufrufen: <a href="http://www.knuddels.de/index.html?c=0" target="_blank" rel="nofollow">Chat - Knuddels.de</a><br />
Auf der Loginseite öffnen wir nun den Quelltext (Firefox: [STRG] + [U]) und suchen darin nach &quot;.jar&quot; (Firefox: [STRG] + [F]. <br />
Damit sollten wir diese Zeile finden:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">&lt;</span><span style="color: #0000BB">applet&nbsp;id</span><span style="color: #007700">=</span><span style="color: #DD0000">"chatapplet"&nbsp;</span><span style="color: #0000BB">name</span><span style="color: #007700">=</span><span style="color: #DD0000">"chatapplet"&nbsp;</span><span style="color: #0000BB">width</span><span style="color: #007700">=</span><span style="color: #DD0000">"100%"&nbsp;</span><span style="color: #0000BB">height</span><span style="color: #007700">=</span><span style="color: #DD0000">"100%"&nbsp;</span><span style="color: #0000BB">code</span><span style="color: #007700">=</span><span style="color: #DD0000">"Start.class"&nbsp;</span><span style="color: #0000BB">archive</span><span style="color: #007700">=</span><span style="color: #DD0000">"knuddelsk90alw.jar"<br /></span><span style="color: #0000BB">codebase</span><span style="color: #007700">=</span><span style="color: #DD0000">"http://chat.knuddels.de/"<br /></span><span style="color: #0000BB">alt</span><span style="color: #007700">=</span><span style="color: #DD0000">"&nbsp;"&nbsp;</span><span style="color: #0000BB">mayscript</span><span style="color: #007700">=</span><span style="color: #DD0000">"yes"&nbsp;</span><span style="color: #0000BB">scriptable</span><span style="color: #007700">=</span><span style="color: #DD0000">"true"&nbsp;</span><span style="color: #007700">&gt;&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div>Der hiervon für uns relevante Teil ist <br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">archive</span><span style="color: #007700">=</span><span style="color: #DD0000">"knuddelsk90alw.jar"&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div>Er gibt uns den Namen des aktuellen Applets an, also momentan <b>knuddelsk90alw.jar</b>. 90alw ist die Appletversion, die sich ständig ändert. <br />
<br />
Dies können wir nun einfach herunterladen, indem wir chat.knuddels.de/ davorsetzen: <a href="http://chat.knuddels.de/knuddelsk90alw.jar" target="_blank" rel="nofollow">http://chat.knuddels.de/knuddelsk90alw.jar</a><br />
Dazu benötigen wir noch das zur Version passende ani-Archiv. Der Archivname lautet gleich wie der des Applets, nur wird knuddelsk durch ani ersetzt: <a href="http://chat.knuddels.de/ani90alw.jar" target="_blank" rel="nofollow">http://chat.knuddels.de/ani90alw.jar</a><br />
<br />
<b>2.3 Java Decompiler</b><br />
<br />
Um den compilierten Javacode von Knuddels wieder in eine einigermaßen lesbare Form zu bringen, brauchen wir einfen Decompiler. <br />
Es gibt hier ein paar verschiedene zur Auswahl. Dabei ist jedoch kein universeller, der alles perfekt decompilieren kann: Der eine compiliert diesen Teil des Applets besser, der andere den anderen.<br />
Für komplexere Vorhaben macht es daher Sinn, mehrere decompiler zu nutzen.<br />
Anfangs spielt das aber keine große Rolle, daher nehmen wir JD in der Gui-Version. <br />
<br />
Download: <a href="http://java.decompiler.free.fr/?q=jdgui" target="_blank" rel="nofollow">JD-GUI | Java Decompiler</a><br />
<br />
<b>3. Erstes decompilieren des Applets</b><br />
<br />
Wir öffnen nun JD-GUI und ziehen das Applet, also knuddelsk90alw.jar, hinein (alternativ auch über File =&gt; Openfile öffnen).<br />
Links sehen wir nun die ganzen Klassen des Applets. Wie man sieht, sind die Namen nicht sehr aussagekräftig (OI, Z1, I5 etc).<br />
Dieses Kunstwerk haben wir dem vom Knuddels eingesetzten obfuscator zu verdanken. Zum einen soll uns dies das Reversen des Applets erschweren, zum anderen ist das Applet durch das obfuscaten kleiner.<br />
<br />
In der linken Leiste suchen wir nun eine Klasse mit dem Namen 'Start'. Diese Klasse wird, wie der Name schon sagt, beim starten des Applets geladen. <br />
Die Start-Klasse erbt immer von der sogenannten 'GroupChat-Klasse', zu erkennen direkt an der ersten Zeile:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">public class Start extends dO<br />
[...]</code><hr />
</div>In der Applet-Version 90alw heißt die GroupChat-Klasse also <b>dO</b>. Dank des obfuscators ändert sich der Name bei jedem Update des Applets.<br />
<br />
In der Start-Klasse sehen wir noch weitere Methoden. Die für uns relevanten sind vorallem init() und start(). <br />
Der Code sieht ziemlich chaotisch und kryptisch aus:<br />
<br />
<div style="margin:20px; margin-top:5px">
<div class="smallfont" style="margin-bottom:2px"><b>Spoiler</b>:<input type="button" value="Show" style="width:45px;font-size:10px;margin:0px;padding:0px;" onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = '';        this.innerText = ''; this.value = 'Hide'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Show'; }">
</div>
<div class="alt2" style="margin: 0px; padding: 6px; border: 1px inset;">
<div style="display: none;">
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">public void init()<br />
&nbsp; {<br />
&nbsp; &nbsp; try<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; f();<br />
&nbsp; &nbsp; &nbsp; break label24;<br />
&nbsp; &nbsp; &nbsp; return;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; catch (Throwable localThrowable)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; label24: <br />
&nbsp; &nbsp; &nbsp; while (true)<br />
&nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; a(t5.a(-20027), localThrowable, null);<br />
&nbsp; &nbsp; &nbsp; &nbsp; continue;<br />
&nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
&nbsp; }</code><hr />
</div>
</div>
</div>
</div><br />
Für die Klasse interessieren wir uns aber erstmal gar nicht, unsere Aufmerksamkeit gilt der GroupChat-Klasse <b>dO</b>.<br />
<br />
<b>4. Den Client aus Java heraus starten</b><br />
<br />
Nun geht es an das eigentliche coden in Java. <br />
Zuerst einmal erstellen wir ein leeres Textdokument mit dem Namen <b>Client</b> und der Datenendung <b>.java</b>. <br />
Dazu müsst ihr entweder in Windows das Anzeigen von Dateierweiterungen aktivieren, oder im Texteditor beim Speichern-Dialog als Dateiname <b>Client.java</b> und als Dateityp <b>Alle Dateien</b> auswählen. <br />
Ansonsten kommen so gebilde wie <b>Client.java.txt</b> heraus, die wir natürlich nicht wollen.<br />
<br />
Nachdem wir diese Datei in einem Texteditor geöffnet haben, fügen wir das Grundgerüst von so ziemlich jeder Java-Anwendung ein:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">public class Client {<br />
&nbsp; &nbsp; public static void main(String[] args) {<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; }<br />
}</code><hr />
</div>Um das Applet zu starten, müssen wir eine neue Instanz der GroupChat-Klasse dO erstellen. <br />
Wenn wir uns die sehr umfangreiche Klasse im Decompiler anschauen, sehen wir, dass der Konstrukteur 2 Argumente aufnehmen kann:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">// ERROR //<br />
&nbsp; public dO(String paramString, int paramInt)<br />
&nbsp; {<br />
&nbsp; &nbsp; // Byte code:<br />
&nbsp; &nbsp; //&nbsp;  0: aload_0<br />
&nbsp; &nbsp; //&nbsp;  1: invokespecial 1333&nbsp; &nbsp; java/applet/Applet:&lt;init&gt;&nbsp; &nbsp; ()V<br />
&nbsp; &nbsp; //&nbsp;  4: aload_0<br />
&nbsp; &nbsp; //&nbsp;  5: sipush 445<br />
&nbsp; &nbsp; //&nbsp;  8: invokestatic 1334&nbsp; &nbsp; t5:a&nbsp; &nbsp; (I)Ljava/lang/String;<br />
&nbsp; &nbsp; //&nbsp;  11: putfield 2295&nbsp; &nbsp; dO:h&nbsp; &nbsp; Ljava/lang/String;</code><hr />
</div>Die Fehler und der bytecode, den dieser Obfuscator nicht korrekt decompilieren konnte, brauch uns erstmal nicht zu interessieren.<br />
Der erste Parameter des Konstrukteurs ist der Chathost, der zweite der entsprechende Port. <br />
Mit diesen Daten wird angegeben, zu welchem Chatsystem (DE, AT, CH, ...) sich das Applet verbinden soll. Knuddels nutzt für diese Chatsysteme jeweils den selben Client.<br />
<br />
Von Knuddels.de lauten diese Daten wie folgt:<br />
Host: chat.knuddels.de<br />
Port: 2710<br />
<br />
Wir erstellen also eine neue Instanz der GroupChat-Klasse und übergeben dieser im Konstrukteur Host und Port:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">dO groupChat = new dO(&quot;chat.knuddels.de&quot;, 2710);</code><hr />
</div>Nun müssen wir das Applet noch initialisieren und starten. <br />
Dafür sehen wir uns mit dem obfuscator erneut die Start-Klasse an und suchen nach den Methoden init() und start:<br />
<br />
<div style="margin:20px; margin-top:5px">
<div class="smallfont" style="margin-bottom:2px"><b>Spoiler</b>:<input type="button" value="Show" style="width:45px;font-size:10px;margin:0px;padding:0px;" onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = '';        this.innerText = ''; this.value = 'Hide'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Show'; }">
</div>
<div class="alt2" style="margin: 0px; padding: 6px; border: 1px inset;">
<div style="display: none;">
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">public void init()<br />
&nbsp; {<br />
&nbsp; &nbsp; try<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; <b>f();</b><br />
&nbsp; &nbsp; &nbsp; break label24;<br />
&nbsp; &nbsp; &nbsp; return;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; catch (Throwable localThrowable)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; label24: <br />
&nbsp; &nbsp; &nbsp; while (true)<br />
&nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; a(t5.a(-20027), localThrowable, null);<br />
&nbsp; &nbsp; &nbsp; &nbsp; continue;<br />
&nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
&nbsp; }<br />
<br />
&nbsp; public void start()<br />
&nbsp; {<br />
&nbsp; &nbsp; try<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; <b>r();</b><br />
&nbsp; &nbsp; &nbsp; break label24;<br />
&nbsp; &nbsp; &nbsp; return;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; catch (Throwable localThrowable)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; label24: <br />
&nbsp; &nbsp; &nbsp; while (true)<br />
&nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; a(t5.a(-19818), localThrowable, null);<br />
&nbsp; &nbsp; &nbsp; &nbsp; continue;<br />
&nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
&nbsp; }</code><hr />
</div>
</div>
</div>
</div><br />
<br />
Hier sehen wir, dass init() als erstes die Methode f() aufruft. Start ruft auch eine Methode auf, die jedoch r() heißt. <br />
Beide gehören zur GroupChat-Klasse. Diese Methoden müssen wir auch aufrufen, um das Applet zu initialisieren und anschließend zu starten:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">dO groupChat = new dO(&quot;chat.knuddels.de&quot;, 2710);<br />
groupChat.f();<br />
groupChat.r();</code><hr />
</div>Nun ist das Applet zwar da, nur wir sehen es nicht. <br />
Da dieser Zustand zur Eingabe von Logindaten ziemlich ungeeignet ist, erzeugen wir ein Fenster, in Java ein sogenanntes <b>JFrame</b>, auf dem wir das Applet plazieren. <br />
Dafür müssen wir zuerst mal javax.swing.JFrame importieren, in dem wir ganz oben vor allem anderen folgende Zeile einfügen:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">import javax.swing.JFrame;</code><hr />
</div>Nun erzeugen wir ein neues JFrame, übergeben dem Parameter den Titel, den unser Fenster haben soll<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">JFrame mainFrame = new JFrame(&quot;Knuddels-Client&quot;);</code><hr />
</div>hier heißt das Fenster 'mainFrame', da es das Hauptfenster unserer Anwendung darstellt. <br />
<br />
Nun müssen wir das Applet natürlich noch unserem JFrame hinzufügen:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">mainFrame.add(groupChat);</code><hr />
</div>Schlussendlich positionieren wir das Fenster noch und machen es sichtbar:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">mainFrame.pack();<br />
mainFrame.setLocationRelativeTo(mainFrame.getRootPane());<br />
mainFrame.setVisible(true);</code><hr />
</div>Damit sind wir codingmäßig erstmal fertig. <br />
Der gesamte Code sollte nun so aussehen: <br />
<br />
<div style="margin:20px; margin-top:5px">
<div class="smallfont" style="margin-bottom:2px"><b>Spoiler</b>:<input type="button" value="Show" style="width:45px;font-size:10px;margin:0px;padding:0px;" onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = '';        this.innerText = ''; this.value = 'Hide'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Show'; }">
</div>
<div class="alt2" style="margin: 0px; padding: 6px; border: 1px inset;">
<div style="display: none;">
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">import javax.swing.JFrame;<br />
<br />
public class Client {<br />
&nbsp; &nbsp; public static void main(String[] args) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; dO groupChat = new dO(&quot;chat.knuddels.de&quot;, 2710);<br />
&nbsp; &nbsp; &nbsp; &nbsp; groupChat.f();<br />
&nbsp; &nbsp; &nbsp; &nbsp; groupChat.r();<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; JFrame mainFrame = new JFrame(&quot;Knuddels-Client&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; mainFrame.add(groupChat);<br />
&nbsp; &nbsp; &nbsp; &nbsp; mainFrame.pack();<br />
&nbsp; &nbsp; &nbsp; &nbsp; mainFrame.setLocationRelativeTo(mainFrame.getRootPane());<br />
&nbsp; &nbsp; &nbsp; &nbsp; mainFrame.setVisible(true);<br />
&nbsp; &nbsp; }<br />
}</code><hr />
</div>
</div>
</div>
</div><br />
<br />
Damit sich das Programm starten lässt, müssen wir es compilieren und anschließend starten. <br />
Da wohl keiner darauf steht jedes mal einzelne Befehle dafür einzugeben, erstellen wir uns eine Batch-Datei, die wir dafür dann nur noch öffnen müssen. <br />
<br />
Also wieder dasselbe Spiel wie vorher bei der Client.java-Datei: Wir erstellen eine neue Datei mit der Dateiendung <b>.bat</b>. Idealerweise nennt man sie <b>start.bat</b>, da sie zum starten des Clienten dient. <br />
<br />
In die Datei kommt folgendes:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">javac Client.java<br />
pause<br />
java Client<br />
pause</code><hr />
</div>javac ist der Java-Compiler, er kompiliert die Datei Client.java. Anschließend führen wir die compilierte Datei mit java aus. <br />
Dazwischen warten wir mit Pause auf einen Tastendruck, falls beim compilieren etwas schiefläuft. Wenn nämlich beim compilieren was schiefläuft, wird die Java-Datei logischerweise nicht compiliert, und java guckt dumm wenn nix zum ausführen da ist. <br />
Bei komplexeren Projekten könnte man sich damit auch etwas zerschießen.<br />
<br />
Jetzt ist soweit alles fertig, es fehlt nur noch eine Sache, und zwar eine wichtige: Das Applet. <br />
Wenn wir kein Applet haben können wir logischerweise auch keines starten, daher ändern wir das jetzt: <br />
Am Anfang haben wir das Applet (knuddelsk90alw.jar) und das dazu passende ani-Archiv heruntergeladen. <br />
Beide Archive entpacken wir nun in den selben Ordner, in dem sowohl Client.java als auch start.bat liegen. <br />
Die Archive dürfen sich jedoch in keinem Unterordner befinden, sonst müssen wir den Classpath von Java anpassen, das lasse ich in diesem Tutorial absichtlich weg. <br />
Dann muss noch der netscape-Ordner rein (befindet sich unten im Anhang, einfach runterladen und entpacken) und der Client ist soweit fertig. <br />
<br />
Wenn euer Client-Ordner nun aus einem Durcheinander von vielen class- und diversen anderen Dateien besteht, ähnlich wie dem folgenden:<br />
<br />
<a href="http://u-img.net/img/5380Wb.png" target="_blank"><img src="http://u-img.net/img/5380Wb_thumb.png" border="0" alt="" /></a><br />
<br />
solltet ihr alles richtig gemacht haben.<br />
<br />
Jetzt könnt ihr start.bat starten und testen, ob alles funktioniert. <br />
Nachdem sich ein schwarzes Fenster geöffnet hat, compiliert Java die Datei Client.java. <br />
Wenn euer Code nicht fehlerhaft ist, sollte Java nichts dazu sagen und direkt zu der pause-Anweisung in der Batch-Datei springen:<br />
<br />
<img src="http://u-img.net/img/4407Ml.png" border="0" alt="" /><br />
<br />
Nachdem ihr irgendeine Taste gedrückt habt, wird der Client gestartet: <br />
<br />
<img src="http://u-img.net/img/2433Tn.png" border="0" alt="" /><br />
<br />
Ihr habt nun einen lokalen Knuddels-Client, mit dem ihr euch normal in Knuddels einloggen könnt.<br />
<br />
<img src="http://u-img.net/img/2459Pg.png" border="0" alt="" /> <b>Der hier erstellte Client befindet sich in der momentan aktuellsten Version (90alw) zusätzlich im Anhang!</b><br />
<br />
<b>5. Nachwort</b><br />
<br />
Im nächsten Tutorial kommt der interessante Teil, nämlich die eigentliche Manipulation des Clienten, dazu. Der hier erzeugte Client ist praktisch der originale Knuddelsclient, der einfach nur lokal gestartet wird. <br />
Er bildet aber die Grundlage für spätere Clientmanipulationen.<br />
<br />
Im nächsten Teil werde ich auch zeigen, wie man das ganze übersichtlicher lößt. In diesem Teil wird einfach alles in einen Ordner geklatscht. Für Anfänger gut, da sie schnell zum Ergebnis kommt weil sie unterschiedliche Pfade nicht beachten müssen (was auch einige Fehlerquellen ausschließt). <br />
<br />
Für produktives Entwickeln ist so ein chaos natürlich absolut ungeeignet, erst recht bei der Manipulation, mit der ab dem nächsten Teil begonnen wird.<br />
<br />
Ausserdem gibt es noch ein paar Tricks, wie man seine Anwendungen dynamischer entwickeln kann, um so wenig wie möglich Variablen bzw Klassennamen zu verwenden, die sich bei einem Appletupdate ändern.<br />
Ein Beispiel wäre das verwenden der Start-Klasse (die ja von der GroupChat-Klasse erbt) anstatt direkt der GroupChat-Klasse. <br />
<br />
Das fällt hier aber alles bewusst weg, damit auch Anfänger schnell mit möglichst wenig Fehlerquellen zu einem Ergebnis kommen.</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>DMW007</dc:creator>
			<guid isPermaLink="true">tutorials-90/paper-2-zugriff-den-knuddelsclient-aus-java-heraus-12977</guid>
		</item>
		<item>
			<title><![CDATA[[Paper #1] Erster Einstieg in die Knuddels-Programmierung]]></title>
			<link>tutorials-90/paper-1-erster-einstieg-in-knuddels-programmierung-8629?goto=newpost</link>
			<pubDate>Wed, 07 Mar 2012 21:31:51 GMT</pubDate>
			<description>Im folgenden ein kleiner Einstieg für angehende Knuddels-Entwickler oder solche die es werden wollen, um erfolgreich Knuddels Software wie Knuddels...</description>
			<content:encoded><![CDATA[<div>Im folgenden ein kleiner Einstieg für angehende Knuddels-Entwickler oder solche die es werden wollen, um erfolgreich Knuddels Software wie Knuddels Bots zu entwickeln. <br />
<br />
<b>1. Vorwort</b><br />
<br />
Gerade als Einsteiger solltet ihr darauf vorbereitet sein, dass ihr nicht ein paar Minuten lang auf eure Tastatur rumhämmert, und anschließend kommt dabei der perfekte Knuddelsbot mit sämtlichen vorstellbaren Funktionen dabei heraus. <br />
Ihr müsst euch selbst in die Materie einarbeiten und viel lesen, bis etwas ordentliches dabei herauskommt, wobei euch das einarbeiten teilweise durch Tutorials und andere Dokumentationen wie diese abgenommen wird. <br />
Geduld ist dabei ebenfalls sehr wichtig. Es wird, besonders am Anfang, öfter vorkommen, dass etwas nicht wie gewünscht funktioniert.<br />
<br />
<b>2. Vorwissen und Kenntnisse</b><br />
<br />
Grundkenntnisse in einer objektorientierten Programmiersprache sind Grundvoraussetzung. Wer nicht zumindestens Grundkenntnisse in einer objektorientierten Programmiersprache besitzt und direkt Knuddels Bots entwickeln möchte, wird sehr wahrscheinlich nach kurzer Zeit aufgeben, ohne nennenswerte Erfolge erzielt zu haben.<br />
Der Knuddels-Client ist in Java geschrieben. Ihr solltet euch auf jeden Fall erstmal etwas in Java einarbeiten, auch wenn ihr bereits Kenntnisse in einer anderen OOP beherrscht - sollten diese nicht vorhanden sein sowieso. <br />
<br />
Es gibt zwar durchaus die Möglichkeit Bots in anderen Sprachen wie Beispielsweise in .NET (C#/VB.NET) zu entwickeln. <br />
Früher war dies problemlos möglich, da Knuddels schließlich nur eine TCP-Verbindung herstellt und Daten überträgt. Heutzutage ist das auch noch realisierbar, jedoch nicht mehr so einfach wie früher, da Knuddels diverse Maßnahmen getroffen hat, um dies zu erschweren.<br />
<br />
Daher solltet ihr euch auf Java fokusieren. Wenn ihr komplett unabhängig von Librarys arbeiten wollt ist dies sowieso unumgänglich, da ihr in jedem Fall das Applet braucht bzw dies sogar manipulieren müsst. <br />
<br />
Es gibt genug Seiten auf denen ihr Java-Grundkenntnisse lernen könnt, diese findet ihr alle über google.<br />
Wie ihr die Grundkenntnisse lernt ist vollkommen egal. Der eine sucht sich ein Anfänger-Tutorial, legt direkt los und schlägt nach was er nicht versteht, der andere schaut sich lieber Video2Brain an, wieder jemand anders ließt sich erstmal das Kapitel der Grundkenntnisse eines Tutorials durch, bevor er loslegt. <br />
<br />
<b>3. Werkzeuge</b><br />
<br />
Welche Werkzeuge ihr braucht, hängt in erster Linie davon ab, was ihr konkret machen wollt. <br />
Unabhängig davon braucht ihr sozusagen als Basis in jedem Fall<br />
<br />
<br />
<br />
<ul><li style=""> <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank" rel="nofollow">das Java-SDL</a>, welches u.a. die Java-Laufzeitumgebung (JRE) und den Java-Compiler enthält</li><li style=""> einen Texteditor - prinzipiell egal welchen, der Windows Editor tut es eigentlich auch schon, ich würde hier jedoch unter Windows <a href="http://www.chip.de/downloads/Notepad_12996935.html" target="_blank" rel="nofollow">Notepad ++</a> bzw unter Linux gedit empfehlen, da beide wesentlich komfortabler sind und einem als Entwickler dezent mit den wichtigsten Funktionen beim Entwickeln unterstützen</li></ul><br />
<br />
<br />
Mit diesen zwei Werkzeugen habt ihr erstmal alles was ihr für den Anfang braucht.<br />
Es gibt natürlich noch eine Reihe weiterer Software für Knuddels Entwickler, wie Beispielsweise mehrere Java Decompiler um den von Knuddels durch <a href="http://de.wikipedia.org/wiki/Obfuscator" target="_blank" rel="nofollow">obfuscaten</a> geschützten Sourcecode wieder einigermaßen lesbar zu machen. Dazu jedoch an anderer Stelle mehr.</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>DMW007</dc:creator>
			<guid isPermaLink="true">tutorials-90/paper-1-erster-einstieg-in-knuddels-programmierung-8629</guid>
		</item>
		<item>
			<title><![CDATA[How to QuizBot [VB]]]></title>
			<link>tutorials-90/how-to-quizbot-vb-4939?goto=newpost</link>
			<pubDate>Sun, 15 Jan 2012 23:20:45 GMT</pubDate>
			<description>Hallo :) 
 
Heute möchte ich euch mal zeigen wie man sich einen QuizBot in VB programmiert.  
 
*Was wir brauchen:* 
 
* Visual Studio Express - ...</description>
			<content:encoded><![CDATA[<div>Hallo :)<br />
<br />
Heute möchte ich euch mal zeigen wie man sich einen QuizBot in VB programmiert. <br />
<br />
<b>Was wir brauchen:</b><br />
<ul><li style="">Visual Studio Express -  <a href="http://www.microsoft.com/germany/express/" target="_blank" rel="nofollow">Microsoft Visual Studio 2010 Express</a> (Express reicht vollkommen)</li><li style="">KNLib - <a href="http://u-hacks.net/sourcecode-91/source-knlib-1930/" target="_blank" rel="nofollow">http://u-hacks.net/sourcecode-91/source-knlib-1930/</a></li><li style=""> Eine Datenbank (ein Script dafür gibt es hier von <b>Comu</b> einfach mal Suchen oder eine fertige Datenbank benutzen.</li></ul><br />
<br />
Wir erstellen ein neues Visual Basic Projekt mit dem Namen &quot;Quizbot Example&quot; und speichern es. Wir sehen nun den Designer mit einer leeren Form die wir nun in etwa so wie auf dem Bild gestalten.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i39.tinypic.com/11grpyo.jpg"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Bevor wir anfangen müssen wir die KNLib noch in unser Projekt einfügen, dazu klicken wir auf <i>Projekt -&gt; Verweis hinzufügen -&gt; Durchsuchen </i> und wählen den Ordner mit der KNLib aus und fügen diese hinzu.<br />
<br />
Nachdem ihr das gemacht habt klickt ihr doppelt auf die Form (am besten in der Titelleiste) um in den Codebereich zu wechseln.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i42.tinypic.com/14aeq6s.jpg"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Als erstes Importieren wir die KNLib:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">Imports&nbsp;KNLib&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Nachdem wir das gemacht haben erstellen wir eine neue Klasse mit dem Namen &quot;Client&quot; und Importieren hier auch die KNLib.<br />
Die Klasse wird von der KNLib erben.<br />
<br />
Code  <b>Client.vb</b><br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i42.tinypic.com/ibx7pz.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Warum ein Bild? Ganz einfach ihr sollt es ja nicht nur einfach kopieren sondern dabei auch was lernen :)<br />
<br />
So nachdem ihr die Klasse Client erstellt habt wechseln wir zurück zur Form1 und zwar in den Codebereich.<br />
<br />
Code <b>Form1.vb</b><br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i43.tinypic.com/2mxqus2.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Wie wir sehen können sind noch weiter Imports dazu gekommen die werden wir später noch brauchen.<br />
Wir erstellen eine Neue Instanz der Client Klasse <br />
Den String Channel brauchen wir um nachher was in den Chat senden zu können.<br />
<b>SetText</b> und <b>AppendText</b> brauchen wir um aus dem OnTokenReceived Threader auf die RichTextBox zuzugreifen zu können.<br />
Sowie <b>SetTextBoxText</b> für die Textbox.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i40.tinypic.com/v49kra.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Mit <b>AddItem</b> können wir wie oben mit <b>AppendText</b>  auf das Listview zugreifen und ein neues Item einfügen.<br />
<b> ListView1.View = View.List</b> Zeit das Listview als Liste an kann man aber beliebig ändern.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i40.tinypic.com/dtpuc.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Die Variable <b>question </b> &amp;<b> answer </b> werden nachher mit der Frage/Antwort gefüllt. <br />
Im OnTokenReceived Thread bekommen wir den InputString von Knuddels den wir zuerst mit <b>Split(vbNullChar)</b> in das String Array <b>token</b> laden.<br />
In der Select Case können wir dann ganz leicht auf die einzelnen tokens zugreifen. Case &quot;k&quot; steht dabei für das Popup Fenster sollte eigentlich soweit klar sein was hier passiert.<br />
Case &quot;a&quot; ist das Channel Info - Paket das man empfangt wenn man einen Channel betritt. Wir übergeben der Variable <b>channel</b> den Wert token(1) was hier der Channelname ist. Den Namen brauchen wir um später was in den Channel schreiben zu können. Case &quot;e&quot; ist das Public Message receive  - Paket<br />
das wir empfangen wenn eine öffentlich Nachricht geschrieben wurde.<br />
In der if-Abfrage (<b>nicht schleife!</b>) fragen wir ab ob der Sender der Nachricht James ist und ob die mit &quot;°B18°_&quot; beginnt. Wenn das der Fall ist, ist diese Nachricht, die Nachricht mit der Frage. Wir trennen nun die frage mit &quot;tokens.Split(&quot;_&quot;)(1).Replace(&quot;\\&quot;, &quot;&quot;).Trim()&quot; und übergeben diese der Variable <br />
<b>question</b>. Als nächstes schicken wir die Frage mit sendrequest(&quot;action=search&amp;q=&quot; + URLEncode(question)) an das Php-Script übergeben dabei den Rückgabewert der Variable <b>answer</b>. In der if-Abfrage prüfen wir nun ob der Rückgabewert leer ist oder die Antwort enthält, falls ja schreiben wir die Antwort in die Textbox oder eben &quot;Keine Lösung gefunden&quot;.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i39.tinypic.com/33to7bq.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
In der nächsten if-Abfrage prüfen wir ob die empfangene Nachricht die Lösung der Frage ist wobei wir das nur dann tun wenn wir zuvor keine Lösung in der Datenbank gefunden haben. (&quot;AndAlso answer = Nothing&quot;). Wie holen uns die Antwort mit Regex und übergeben sie der Variable <b> Antwort</b> und senden die Lösung mit sendrequest(URLEncode(question) &amp; &quot;&amp;a=&quot; &amp; URLEncode(Antwort) an das Script. Und geben eine Meldung aus das die Antwort hinzugefügt wurde. <br />
Me.AppendText(&quot;Lösung würde hinzugefügt!&quot; &amp; vbCrLf)<br />
Der letzte Abschnitt im Case &quot;e&quot; gibt die Chatnachrichten aus sollte klar sein. <br />
Case &quot;j&quot; empfangen wir wenn wir den Channel wechseln sollte jetzt klar sein.<br />
Case &quot;r&quot; empfangen wir wenn wir eine Private Nachricht erhalten.<br />
Sollte auch klar. <br />
Case &quot;l&quot; empfangen wir wenn jemand den Channel betritt.<br />
Gibt eine Meldung in der Richtextbox aus und fügt den Nick die Listviewbox hinzu. Hier könnte man noch die Farbe des Nicks auslesen die in token(3) steht. <br />
Case &quot;u&quot; das Paket enthält die Userliste vom aktuellen Channel <br />
Wie geben in der Richtextbox eine Meldung aus wie viele Einträge die Datenbank momentan hat. <br />
<br />
<a href="http://imageshack.us/photo/my-images/853/unbenannt9a.png/" target="_blank" rel="nofollow"><br />
<img src="http://img853.imageshack.us/img853/5883/unbenannt9a.png" border="0" alt="" /></a><br />
<br />
In der If-Abfrage holen wir uns dann die einzelnen Nicks raus und fügen sie in eine Schleife in die Listviewbox ein.<br />
Mit der Funktion sendrequest rufen wir das Php Script mit dem angegebenen Parameter auf und geben den Inhalt zurück.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i39.tinypic.com/2exm35j.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
Die Funktion URLEncode brauchen wir um Umlauten und Sonderzeichen der Frage/Antwort in ein Prozent-Zeichen und dem zweistelligen, hexadezimalen ASCII-Wert umzuwandeln.<br />
<br />
<a style="font-weight:bold;text-decoration:none;" target="blank" href="http://i39.tinypic.com/2vrzzfp.png"><img  style="vertical-align:text-bottom;" src="https://u-img.net/img/2542Da.png"> BILD ANZEIGEN </a> <a style="font-size:10px;text-decoration:none;" href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="blank"> [Warum wird das Bild nicht angezeigt?]</a><br />
Die Funktion DelSpecChar Entfernt alle nicht benötigte Sonderzeichen aus einem String ŠåÆ usw.<br />
Im Button1_Click Verbinden wir uns mit Knuddels hier .de und loggen uns mit den Daten ein.<br />
TextBox4_KeyDown wenn wir in der Textbox auf Enter drücken wird der Text aus der TextBox4 in den Channel gesendet.<br />
RichTextBox1_TextChanged Wenn sich der Text ändert scrollen wir bis ans ende der RichTextBox.<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">Private&nbsp;</span><span style="color: #0000BB">Sub&nbsp;Form1_FormClosed</span><span style="color: #007700">(</span><span style="color: #0000BB">sender&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Object</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">e&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">System</span><span style="color: #007700">.</span><span style="color: #0000BB">Windows</span><span style="color: #007700">.</span><span style="color: #0000BB">Forms</span><span style="color: #007700">.</span><span style="color: #0000BB">FormClosedEventArgs</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">Handles&nbsp;Me</span><span style="color: #007700">.</span><span style="color: #0000BB">FormClosed<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Environment</span><span style="color: #007700">.Exit(</span><span style="color: #0000BB">0</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">End&nbsp;Sub&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Brauchen wir noch um die Anwendung vollständig zu beenden.<br />
<br />
Ich hoffe ihr habt das Tutorial verstanden, und ich konnte euch alles gut übermitteln ^^<br />
Falls ich was vergessen hab oder ihr Fehler findet meldet euch bei mir :D<br />
<br />
<a href="http://&#91;url=http://localhostr.com/file/YfWWEij/Quizbot%20Example%20GUI.rar]Quizbot Example GUI.rar | localhostr.com&#91;/url]" target="_blank" rel="nofollow"><a href="http://localhostr.com/file/YfWWEij/Quizbot%20Example%20GUI.rar" target="_blank" rel="nofollow">Quizbot Example GUI.rar | localhostr.com</a></a></div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>uncopyable</dc:creator>
			<guid isPermaLink="true">tutorials-90/how-to-quizbot-vb-4939</guid>
		</item>
		<item>
			<title><![CDATA[[Tutorial][#3] Chatverlauf]]></title>
			<link>tutorials-90/tutorial-3-chatverlauf-1233?goto=newpost</link>
			<pubDate>Sun, 27 Nov 2011 15:42:28 GMT</pubDate>
			<description>Nabend, mein letztes Tutorial habe ich vor fast einer Woche gepostet, verzeiht mir diese lange Wartezeit :) 
 
In diesem Tutorial geht es darum den...</description>
			<content:encoded><![CDATA[<div><div style="text-align: center;">Nabend, mein letztes Tutorial habe ich vor fast einer Woche gepostet, verzeiht mir diese lange Wartezeit :)<br />
<br />
In diesem Tutorial geht es darum den Chatverlauf etwas schöner darzustellen.<br />
Ich möchte allerdings, dass ihr lernt selbstständig zu arbeiten, deswegen werde ich nur einfache Codes posten, die ihr dann erweitern könnt, damit euer Bot nicht zu einem C&amp;P Projekt wird ;)<br />
<br />
Momentan könnte euer Chatverlauf so aussehen:<br />
<img src="https://u-img.net/img/3157Gy.png" border="0" alt="" /><br />
Wir möchten diesen allerings in etwa so haben:<br />
<img src="https://u-img.net/img/7157Xn.png" border="0" alt="" /><br />
<br />
Dann fangen wir mal an, das ist nicht wirklich schwer,<br />
wir schreiben eine Methode und ändern den restlichen Code etwas.<br />
<br />
Zuerst erstellen wir diese Methode:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">Private Sub WriteText(ByVal Absender As String, ByVal AbsenderFarbe As Color, ByVal Text As String, ByVal TextFarbe As Color)<br />
&nbsp; &nbsp; &nbsp; &nbsp; RichTextBox1.SelectionColor = AbsenderFarbe<br />
&nbsp; &nbsp; &nbsp; &nbsp; RichTextBox1.AppendText(Absender &amp; &quot;: &quot;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; RichTextBox1.SelectionColor = TextFarbe<br />
&nbsp; &nbsp; &nbsp; &nbsp; RichTextBox1.AppendText(Text &amp; vbLf)<br />
&nbsp; &nbsp; End Sub</code><hr />
</div>und passen diese an. (Nur falls eure RichTextBox nicht RichTextBox1 heißt.)<br />
<br />
Anschließend passen wir den restlichen Code noch an, d.h. wir ersetzen z.b. im PublicMessage Event:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">RichTextBox1.AppendText(Nick &amp; &quot;: &quot; &amp; Message &amp; vbLf)</code><hr />
</div>mit<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">WriteText(Nick, Color.Red, Message, Color.Black)</code><hr />
</div>Ihr könnt nun noch die Methode umschreiben, z.b. könnt ihr die Font ändern, fett oder kursiv schreiben usw..<br />
<br />
Früher war es noch möglich den Chatverlauf schön sauber zu halten, mittlerweile gibt es aber schon so viele verschiedene Sonderzeichen (sind es eigentlich nicht aber ich weiß nicht, wie man das nennt, also z.b. dieses °serverpp oder so in der Art) , dass es nicht möglich ist den Chatverlauf davon 100% zu befreien, zumindest würde es viel zu lange dauern...</div></div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>Snees</dc:creator>
			<guid isPermaLink="true">tutorials-90/tutorial-3-chatverlauf-1233</guid>
		</item>
		<item>
			<title><![CDATA[[Tutorial][#2] Userlist einfärben]]></title>
			<link>tutorials-90/tutorial-2-userlist-einfaerben-650?goto=newpost</link>
			<pubDate>Mon, 21 Nov 2011 14:16:45 GMT</pubDate>
			<description>In diesem Tutorial möchte ich euch das ListView-Steuerelement etwas besser erklären und euch zeigen, wie ihr damit arbeitet und welche Funktionen ihr...</description>
			<content:encoded><![CDATA[<div><div style="text-align: center;">In diesem Tutorial möchte ich euch das ListView-Steuerelement etwas besser erklären und euch zeigen, wie ihr damit arbeitet und welche Funktionen ihr noch nutzen könnt.<br />
Bisher kennen wir unsere Userlist im ListView-Steuerelement als eine einfache List, wo der einzige Unterschied der verschiedenen Nutzer im Namen liegt.<br />
Jetzt wollen wir aber gerne noch die Farbe des Benutzers im Channel anpassen und optional das Alter und das Geschlecht anzeigen lassen.<br />
<br />
Dazu schauen wir uns das ListView-Steuerelement einmal an.<br />
Bisher kennen wir unsere Userlist nur so:<br />
<br />
<img src="https://u-labs.de/forum/attachment.php?attachmentid=3103&amp;d=1359906022" border="0" alt="Name:  bild17eugb.png
Hits: 1244
Größe:  922 Bytes" class="thumbnail" style="float:CONFIG" /><br />
<br />
Wir möchten aber gerne eine Überschrift, die Namen farbig und hinter den Namen das Alter und das Geschlecht stehen haben. Das würde dann in etwa so aussehen:<br />
<img src="https://u-labs.de/forum/attachment.php?attachmentid=3104&amp;d=1359906031" border="0" alt="Name:  bild2hqub4.png
Hits: 1199
Größe:  2,3 KB" class="thumbnail" style="float:CONFIG" /><br />
<br />
Um dieses Ziel zu erreichen benutzen wir folgenden Code:<br />
Entweder ihr geht in das Eigenschaften-Fenster des ListView-Steuerelements und ändert die Eigenschaft View auf Details oder ihr fügt im Form_Load Event folgenden Code ein:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ListView1.View = View.Details</code><hr />
</div>Anschließend schreibt ihr unter diesen Code noch folgenden Code:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ListView1.Columns.Add(&quot;Username&quot;).Width = 120</code><hr />
</div>Damit fügen wir eine Spalte in unserem Steuerelement hinzu, diese hat die Breite 120 und heißt Username. Man kann den Namen und die Breite beliebig ändern.<br />
<br />
So hätten wir das schon geschafft, jetzt stellt man sich aber die Frage, wie man nun die Namen in der Userlist färbt und wie man das Alter und Geschlecht angeben kann.<br />
Dazu schauen wir uns mal den Code bei client_OnChannelJoin an.<br />
<br />
Wenn wir nun dort schreiben:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ListView1.Items.Add(User.Name)</code><hr />
</div>Dann wird der Name des Nutzers, der den Channel betritt der Userlist hinzugefügt, um den Namen nun noch farbig zu gestalten schauen wir uns die Eigenschaften von User an.<br />
Man kann dort z.B. über die Farbe des Benutzers Informationen erhalten.<br />
Wenn wir also den User der Liste hinzufügen wollen und ihn seinem Rang entsprechend färben wollen machen wir das so:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ListView1.Items.Add(User.Name).ForeColor = User.Color</code><hr />
</div>Jetzt fehlt uns nurnoch die Angabe des Alters und des Geschlechts. Dafür ändern wir unseren Code ein weiteres Mal:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ListView1.Items.Add(User.Name &amp; &quot;, (&quot; &amp; User.Age &amp; &quot;,&quot; &amp; User.Sex &amp; &quot;)&quot;).ForeColor = User.Color</code><hr />
</div>Mit diesem Code schaffen wir das, was wir uns am Anfang des Tutorials vorgenommen haben.<br />
Allerdings reicht es nicht diesen Code im client_OnChannelJoin zu schreiben, wir brauchen diesen Code auch noch im client_OnUserListReceive.<br />
Dort erstzen wir den Code<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ListView1.Items.Add(User.Name)</code><hr />
</div>mit <br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">ListView1.Items.Add(User.Name &amp; &quot;, (&quot; &amp; User.Age &amp; &quot;,&quot; &amp; User.Sex &amp; &quot;)&quot;).ForeColor = User.Color</code><hr />
</div>und sind somit fertig.<br />
Falls ihr noch Fragen habt, einfach melden :)<br />
</div></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Angehängte Grafiken</legend>
				<div style="padding:10px">
				<img class="attach" src="https://u-labs.de/forum/attachment.php?attachmentid=3103&amp;stc=1&amp;d=1359906022" alt="" />&nbsp;<img class="attach" src="https://u-labs.de/forum/attachment.php?attachmentid=3104&amp;stc=1&amp;d=1359906031" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>Snees</dc:creator>
			<guid isPermaLink="true">tutorials-90/tutorial-2-userlist-einfaerben-650</guid>
		</item>
		<item>
			<title><![CDATA[[Tutorial][#1] Bot programmieren [VB.NET]]]></title>
			<link>tutorials-90/tutorial-1-bot-programmieren-vb-net-619?goto=newpost</link>
			<pubDate>Sun, 20 Nov 2011 22:06:49 GMT</pubDate>
			<description>Hallo, ich schreibe momentan eine Tutorial-Reihe, wie ihr einen eigenen Knuddels-Bot 
programmieren könnt. Es wird kein besonderer Bot sein, sondern...</description>
			<content:encoded><![CDATA[<div>Hallo, ich schreibe momentan eine Tutorial-Reihe, wie ihr einen eigenen Knuddels-Bot<br />
programmieren könnt. Es wird kein besonderer Bot sein, sondern ein ganz einfacher, mit dem ihr<br />
euch in den Knuddels-Chat einloggen und mit anderen Mitgliedern chatten könnt.<br />
Anti-Admin, Stayonline usw. wird unser Bot vorerst nicht enthalten.<br />
<br />
Dann fangen wir direkt mal an.<br />
<br />
Unser Bot wird in VB.NET geschrieben.<br />
Dazu brauchen wir zuerst einmal Visual Studio. (<a href="http://www.microsoft.com/germany/express/download/default.aspx" target="_blank" rel="nofollow">Download Visual Basic 2010</a>)<br />
KNLib<br />
Das aktuelle, manipulierte Applet.<br />
<br />
Ihr öffnet Visual Studio und klickt auf Datei -&gt; Neues Projekt.<br />
Jetzt öffnet sich ein Fenster mit verschiedenen Möglichkeiten einer Anwendung.<br />
<br />
Wir wählen &quot;Windows Forms-Anwendung&quot;, da wir weder eine Konsolenanwedung, noch eine <br />
Klasse oder eine Anwendung mit Effekten erstellen wollen.<br />
<br />
Nun seht ihr eine Form (&quot;Form1&quot;), diese ist allerdings noch leer.<br />
Links befindet sich die Toolbox, wir ziehen nun folgende Elemente aus der Toolbox auf unsere<br />
Form1:<br />
-2 Button (Login, Logout)<br />
-4 Textboxen (Nickname, Passwort, Channel, an Chat senden)<br />
-1 Combobox (Auswahl des Chatsystems)<br />
-1 RichTextBox (Chatverlauf)<br />
-1 ListView (Userliste)<br />
<br />
Die Elemente könnt ihr anordnen, wie ihr wollt, es bleibt euch überlassen.<br />
<br />
Nun beschriften wir unsere Elemente.<br />
1. Button: Login<br />
2. Button: Logout<br />
1. Textbox: Nickname (Text-Eigenschaft)<br />
2. Textbox: Passwort (in den Eigenschaften noch zusätzlich &quot;UseSystemPasswordChar&quot; auf true ändern<br />
3. Textbox: Channel<br />
4. Textbox: Text an Chat senden<br />
1. Combobox: im Eigenschaften-Fenster bei &quot;Items&quot; auf &quot;Auflistung&quot; klicken und dann untereinander<br />
folgende Werte eintragen:<br />
DE<br />
AT<br />
CH<br />
Die Richtextbox und das ListView beschriften wir nicht.<br />
Nun klicken wir noch auf unsere Form und ändern den Titel unserer Anwedung (ebenfalls mit der Text-Eigenschaft).<br />
Ihr könnt den Titel beliebig ändern, beispielsweise: &quot;Mein erster Bot&quot; etc.<br />
<br />
Die Oberfläche ist nun fertig, natürlich kann man noch viele andere Änderungen vornehmen,<br />
aber in diesem Tutorial soll es zuerst darum gehen einen Bot zu coden.<br />
<br />
Wir sehen nun also die fertige Oberfläche und drücken nun F7,<br />
damit gelangen wir in den Bereich, in dem wir unseren Code schreiben.<br />
Bis jetzt stehen dort es zwei Zeilen, aber das werden wir ganz schnell ändern.<br />
<br />
Zuerst müssen wir die KNLib importieren, dazu klicken wir auf Projekt -&gt; Verweis hinzufügen,<br />
dann auf &quot;Durchsuchen&quot; und in den Ordner navigieren, in dem die KNLib bei euch liegt.<br />
Wir wählen die KNLib aus und klicken auf OK.<br />
Nun klickt ihr auf Datei -&gt; Alles speichern und geht in den Debug Ordner, das Applet was sich dort befindet löscht ihr und fügt dort das aktuelle Applet ein.<br />
<br />
Nun müssen wir die KNLib noch mittels des Codes importieren, dazu schreiben wir über<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">Public&nbsp;Class&nbsp;</span><span style="color: #0000BB">Form1&nbsp;<br /></span>
</span>
</code></code><hr />
</div><div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">Imports&nbsp;KNLib&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Anschließend schreiben wir unter <div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">Public&nbsp;Class&nbsp;</span><span style="color: #0000BB">Form1&nbsp;<br /></span>
</span>
</code></code><hr />
</div>diesen Code:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">Dim&nbsp;applet&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Applet&nbsp;<br /></span>
</span>
</code></code><hr />
</div>und<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">Dim&nbsp;WithEvents&nbsp;client&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">KSClient&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Wir gehen nun wieder zu unserer Oberfläche und machen einen Doppelklick auf die Form,<br />
so gelangen wir wieder in den Code-Bereich und es wurde die Methode Form1_Load hinzugefügt<br />
Dort schreiben wir nun folgenden Code:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">Control</span><span style="color: #007700">.</span><span style="color: #0000BB">CheckForIllegalCrossThreadCalls&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">False<br />applet&nbsp;</span><span style="color: #007700">=&nbsp;New&nbsp;</span><span style="color: #0000BB">Applet<br />client&nbsp;</span><span style="color: #007700">=&nbsp;New&nbsp;</span><span style="color: #0000BB">KSClient</span><span style="color: #007700">(</span><span style="color: #0000BB">applet</span><span style="color: #007700">)&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div>Nun gehen wir wieder zu der Oberfläche und machen einen Doppelklick auf den Login-Button<br />
Nun fügen wir folgenden Code hinzu:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">Dim&nbsp;CSystem&nbsp;</span><span style="color: #007700">As&nbsp;New&nbsp;</span><span style="color: #0000BB">ChatSystem<br />Select&nbsp;</span><span style="color: #007700">Case&nbsp;</span><span style="color: #0000BB">ComboBox1</span><span style="color: #007700">.</span><span style="color: #0000BB">Text<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">Case&nbsp;</span><span style="color: #DD0000">"DE"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">CSystem&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ChatSystem</span><span style="color: #007700">.</span><span style="color: #0000BB">DE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">Case&nbsp;</span><span style="color: #DD0000">"AT"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">CSystem&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ChatSystem</span><span style="color: #007700">.</span><span style="color: #0000BB">AT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">Case&nbsp;</span><span style="color: #DD0000">"CH"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">CSystem&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">ChatSystem</span><span style="color: #007700">.</span><span style="color: #0000BB">CH<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;Select<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">Connect</span><span style="color: #007700">(</span><span style="color: #0000BB">CSystem</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">client</span><span style="color: #007700">.</span><span style="color: #0000BB">Login</span><span style="color: #007700">(</span><span style="color: #0000BB">TextBox1</span><span style="color: #007700">.</span><span style="color: #0000BB">Text</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">TextBox2</span><span style="color: #007700">.</span><span style="color: #0000BB">Text</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">TextBox3</span><span style="color: #007700">.</span><span style="color: #0000BB">Text</span><span style="color: #007700">)&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div>	<br />
Nun gehen wir wieder zu unserer Oberfläche und machen einen Doppelklick auf den Logout-Button<br />
und fügen folgenden Code hinzu:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">client</span><span style="color: #007700">.</span><span style="color: #0000BB">Disconnect</span><span style="color: #007700">()&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div>Wir gehen wieder zu unserer Oberfläche, klicken auf die Form und gehen im Ereignisse-Fenster auf<br />
auf &quot;FormClosed&quot; und machen einen Doppelklick darauf, nun gelangen wir wieder in den Code-Bereich<br />
und es ist die Methode Form1_FormClosed erschienen, dort fügen wir folgenden Code ein:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">System</span><span style="color: #007700">.</span><span style="color: #0000BB">Environment</span><span style="color: #007700">.Exit(</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div>Das Grundgerüst steht nun, wir können uns einloggen und ausloggen, aber was fehlt noch?<br />
Richtig, der Chatverlauf, die Userliste und der Text, den wir an den Chat senden wollen.<br />
<br />
Wir wollen zuerst einmal die Userliste mit leben füllen, dazu fügen wir folgenden Code hinzu:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">Private&nbsp;</span><span style="color: #0000BB">Sub&nbsp;client_OnUserListReceive</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;sender&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Object</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;UserList&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">System</span><span style="color: #007700">.</span><span style="color: #0000BB">Collections</span><span style="color: #007700">.</span><span style="color: #0000BB">Generic</span><span style="color: #007700">.List(</span><span style="color: #0000BB">Of&nbsp;KNLib</span><span style="color: #007700">.</span><span style="color: #0000BB">User</span><span style="color: #007700">))&nbsp;</span><span style="color: #0000BB">Handles&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">OnUserListReceive<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListView1</span><span style="color: #007700">.</span><span style="color: #0000BB">Items</span><span style="color: #007700">.</span><span style="color: #0000BB">Clear</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;</span><span style="color: #0000BB">Each&nbsp;User&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">KNLib</span><span style="color: #007700">.</span><span style="color: #0000BB">User&nbsp;In&nbsp;UserList<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListView1</span><span style="color: #007700">.</span><span style="color: #0000BB">Items</span><span style="color: #007700">.</span><span style="color: #0000BB">Add</span><span style="color: #007700">(</span><span style="color: #0000BB">User</span><span style="color: #007700">.</span><span style="color: #0000BB">Name</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">Next<br />&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;Sub<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">Private&nbsp;</span><span style="color: #0000BB">Sub&nbsp;client_OnChannelJoin</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;sender&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Object</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;User&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">KNLib</span><span style="color: #007700">.</span><span style="color: #0000BB">User</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">Handles&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">OnChannelJoin<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListView1</span><span style="color: #007700">.</span><span style="color: #0000BB">Items</span><span style="color: #007700">.</span><span style="color: #0000BB">Add</span><span style="color: #007700">(</span><span style="color: #0000BB">User</span><span style="color: #007700">.</span><span style="color: #0000BB">Name</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">End&nbsp;Sub<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">Private&nbsp;</span><span style="color: #0000BB">Sub&nbsp;client_OnChannelLeave</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;sender&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Object</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;User&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">KNLib</span><span style="color: #007700">.</span><span style="color: #0000BB">User</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">Handles&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">OnChannelLeave<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListView1</span><span style="color: #007700">.</span><span style="color: #0000BB">FindItemWithText</span><span style="color: #007700">(</span><span style="color: #0000BB">User</span><span style="color: #007700">.</span><span style="color: #0000BB">Name</span><span style="color: #007700">).</span><span style="color: #0000BB">Remove</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">End&nbsp;Sub&nbsp;<br /></span>
</span>
</code></code><hr />
</div>	<br />
Jetzt wollen wir noch den Chatverlauf mit Leben füllen, dazu verwenden wir folgenden Code:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">Private&nbsp;</span><span style="color: #0000BB">Sub&nbsp;client_OnPublicMessage</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;sender&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Object</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;Nick&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;Message&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">Handles&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">OnPublicMessage<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RichTextBox1</span><span style="color: #007700">.</span><span style="color: #0000BB">AppendText</span><span style="color: #007700">(</span><span style="color: #0000BB">Nick&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #DD0000">":&nbsp;"&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #0000BB">Message&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #0000BB">vbLf</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">End&nbsp;Sub<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">Private&nbsp;</span><span style="color: #0000BB">Sub&nbsp;client_OnPrivateMessage</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;sender&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Object</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;fromNick&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;toNick&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;Message&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">Handles&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">OnPrivateMessage<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RichTextBox1</span><span style="color: #007700">.</span><span style="color: #0000BB">AppendText</span><span style="color: #007700">(</span><span style="color: #0000BB">fromNick&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #DD0000">"&nbsp;an&nbsp;"&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #0000BB">toNick&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #DD0000">":&nbsp;"&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #0000BB">Message&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #0000BB">vbLf</span><span style="color: #007700">)<br /></span><span style="color: #0000BB">End&nbsp;Sub&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Wenn wir gepingt werden wollen wir das natürlich auch wissen, also fügen wir wieder folgenden Code hinzu:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">Private&nbsp;</span><span style="color: #0000BB">Sub&nbsp;client_OnPing</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;sender&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Object</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;Nick&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;Key&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">Handles&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">OnPing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox</span><span style="color: #007700">.</span><span style="color: #0000BB">Show</span><span style="color: #007700">(</span><span style="color: #DD0000">"Ping&nbsp;erhalten&nbsp;von&nbsp;"&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #0000BB">Nick</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">End&nbsp;Sub&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Und wenn wir ein Popup empfangen wollen wir das auch sehen, also:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">Private&nbsp;</span><span style="color: #0000BB">Sub&nbsp;client_OnPopup</span><span style="color: #007700">(</span><span style="color: #0000BB">ByVal&nbsp;sender&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">Object</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;Message&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">ByVal&nbsp;token</span><span style="color: #007700">()&nbsp;As&nbsp;</span><span style="color: #0000BB">String</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">Handles&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">OnPopup<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox</span><span style="color: #007700">.</span><span style="color: #0000BB">Show</span><span style="color: #007700">(</span><span style="color: #0000BB">Message</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"Popup"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">End&nbsp;Sub&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Nun haben wir den Chatverlauf und die Userlist, es fehlt also noch... Text an den Chat senden<br />
Dazu klicken wir auf unsere 4. Textbox, die wir verwenden um den Text einzugeben,<br />
wir gehen in das Ereignis-Fenster und machen einen Doppelklick auf &quot;KeyDown&quot;.<br />
Dann erscheint eine Methode &quot;TextBox4_KeyDown, dort fügen wir folgenden Code ein:<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">If&nbsp;</span><span style="color: #0000BB">client</span><span style="color: #007700">.</span><span style="color: #0000BB">IsConnected&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">True&nbsp;Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">If&nbsp;</span><span style="color: #0000BB">e</span><span style="color: #007700">.</span><span style="color: #0000BB">KeyCode&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Keys</span><span style="color: #007700">.</span><span style="color: #0000BB">Enter&nbsp;Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e</span><span style="color: #007700">.</span><span style="color: #0000BB">SuppressKeyPress&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">True<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client</span><span style="color: #007700">.</span><span style="color: #0000BB">SendMessage</span><span style="color: #007700">(</span><span style="color: #0000BB">TextBox4</span><span style="color: #007700">.</span><span style="color: #0000BB">Text</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">TextBox4</span><span style="color: #007700">.</span><span style="color: #0000BB">Clear</span><span style="color: #007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">End&nbsp;</span><span style="color: #007700">If<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">MessageBox</span><span style="color: #007700">.</span><span style="color: #0000BB">Show</span><span style="color: #007700">(</span><span style="color: #DD0000">"Sind&nbsp;wir&nbsp;eingeloggt?"</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">End&nbsp;</span><span style="color: #007700">If&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div>Somit sind wir fertig und können unseren Bot benutzen, ich hoffe euch hat das Tutorial gefallen,<br />
es war mein erstes Text-Tutorial, also seid lieb ;) <br />
Wenn ich demnächst nochmal Zeit finde werde ich ein weiteres Tutorial schreiben,<br />
bei Fragen bitte im Thread posten und ich versuche dann so gut wie möglich zu antworten!<br />
<br />
/e Ich habe den Code noch nicht erklärt, werde ich aber noch editieren!</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>Snees</dc:creator>
			<guid isPermaLink="true">tutorials-90/tutorial-1-bot-programmieren-vb-net-619</guid>
		</item>
		<item>
			<title><![CDATA[[JavaScript]: K-Script Client PopUps oder Ausgaben hinzufügen]]></title>
			<link>tutorials-90/javascript-k-script-client-popups-ausgaben-hinzufuegen-29754?goto=newpost</link>
			<pubDate>Wed, 20 Apr 2011 19:42:56 GMT</pubDate>
			<description>Hallo, 
 
ich wollte Euch einmal erklären was Ihr mit dem Scripts Ordner alles anstellen könnt. Ihr könnt beliebig Commands einfügen, zum Beispiel...</description>
			<content:encoded><![CDATA[<div>Hallo,<br />
<br />
ich wollte Euch einmal erklären was Ihr mit dem Scripts Ordner alles anstellen könnt. Ihr könnt beliebig Commands einfügen, zum Beispiel könnt ihr Popups oder auch Messages einfügen die über ein / Command dargestellt werden können.<br />
<u><b><br />
Schritt 1: PopUps hinzufügen</b></u><br />
<br />
Um die Funktionen einzufügen, müsst Ihr in den Ordner <b>scripts</b> gehen, und dann die Datei <b>command.js </b>über einen Editor öffnen.<br />
<br />
Sobald Ihr das getan habt, seht Ihr ein Beispiel Command. Dieses lässt Ihr bitte drinnen. Jetzt können wir zum Beispiel ein PopUp darstellen, das geht folgendermaßen:<br />
<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">args</span><span style="color: #007700">&#91;</span><span style="color: #0000BB">0</span><span style="color: #007700">&#93;.</span><span style="color: #0000BB">equalsIgnoreCase</span><span style="color: #007700">(</span><span style="color: #DD0000">"popup"</span><span style="color: #007700">))&nbsp;{&nbsp;</span><span style="color: #FF8000">//&nbsp;Name&nbsp;des&nbsp;Commands<br /></span><span style="color: #007700">new&nbsp;</span><span style="color: #0000BB">Packages</span><span style="color: #007700">.</span><span style="color: #0000BB">Popup</span><span style="color: #007700">.</span><span style="color: #0000BB">showPopup</span><span style="color: #007700">(</span><span style="color: #DD0000">"POPUP-TEST"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"Popup"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"PopUp-Test&nbsp;°&gt;sm_00.gif&lt;°§"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">400</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">200</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">client</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;"Popup-Test"&nbsp;ist&nbsp;der&nbsp;Name&nbsp;des&nbsp;Fensters&nbsp;"Popup"&nbsp;ist&nbsp;der&nbsp;Text&nbsp;der&nbsp;oben&nbsp;auf&nbsp;Weißer&nbsp;fläche&nbsp;dargestellt&nbsp;wird.&nbsp;"400,200"&nbsp;ist&nbsp;die&nbsp;Beite&nbsp;und&nbsp;Höhe&nbsp;des&nbsp;Popupfensters.<br /></span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />}&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div><b><br />
<br />
400, 200</b> steht für die Breite und Höhe des PopUp's<br />
equalsIgnoreCase(&quot;<b>popup</b>&quot;)) PopUp ist das Command mit dem Ihr das PopUp Fenster aufrufen könnt. Also /popup.<br />
<br />
<br />
Solltet Ihr über den Clienten noch Eingeloggt sein, müsst ihr auf das Symbol vom KS Clienten einen Rechtsklick betätigen, und dann auf Scripts neu laden klicken. Dann könnt Ihr probieren, ob ihr unter der Eingabe /popup ein PopUp zu sehen bekommt.<br />
<br />
So sollte es dann aussehen:<br />
<br />
<a href="http://oi56.tinypic.com/2zpo26o.jpg" target="_blank" rel="nofollow"><img src="http://u-img.net/img/2542Da.png" border="0" alt="" /> BILD ANZEIGEN </a> <a href="http://u-hacks.net/news-und-ankuendigungen-4/erlaubte-imagehoster-17046/" target="_blank" rel="nofollow"> [Warum wird das Bild nicht angezeigt?]</a><br />
<br />
<br />
<u><b>Schritt 2: Messages ausgeben</b></u><br />
<br />
Mit Messages ausgeben meine ich, das was Öffentlich geschrieben wird, also zum Beispiel:<b>&quot;James (privat):&quot;</b> oder <b>James: Hallo, blablabla..</b><br />
<br />
Das ganze ist auch genau so einfach wie das mit den PopUps. Dafür ruft Ihr die gleiche Datei und den gleichen Ordner wieder auf, also: <b>/scripts/command.js</b>. Jetzt könnten wir einen Text ausgeben in den Channel, den Ihr natürlich nur seht.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">args</span><span style="color: #007700">&#91;</span><span style="color: #0000BB">0</span><span style="color: #007700">&#93;.</span><span style="color: #0000BB">equalsIgnoreCase</span><span style="color: #007700">(</span><span style="color: #DD0000">"test"</span><span style="color: #007700">))&nbsp;{&nbsp;</span><span style="color: #FF8000">//&nbsp;Name&nbsp;des&nbsp;Commands<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">client</span><span style="color: #007700">.print(</span><span style="color: #DD0000">"°R°_°&gt;p1rates|/w&nbsp;p1&lt;°&nbsp;(privat):&nbsp;§Testcommand!"</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;"°R°_°&gt;p1rates|/w&nbsp;p1&lt;°&nbsp;(privat):"&nbsp;ist&nbsp;nur&nbsp;dafür&nbsp;da&nbsp;um&nbsp;es&nbsp;Privat&nbsp;darzustellen,&nbsp;das&nbsp;alles&nbsp;ist&nbsp;der&nbsp;Text&nbsp;der&nbsp;ausgegeben&nbsp;wird.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div>equalsIgnoreCase(&quot;<b>test</b>&quot;)) { Das ganze steht für dem Namen des Commands, also /test.<br />
<br />
Solltet Ihr alles richtig gemacht haben solltet Ihr folgendes im Chat sehen:<br />
<br />
<img src="https://u-labs.de/forum/attachment.php?attachmentid=6529&amp;d=1392071961" border="0" alt="Name:  testcmd.jpg
Hits: 725
Größe:  1,8 KB" class="thumbnail" style="float:CONFIG" /><br />
<br />
(Kack Quali, sorry.)<br />
<br />
Solltet Ihr alles richtig gemacht haben, sollte Eure <b>/scripts/command.js</b> so aussehen:<br />
<br />
 <div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB"></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">parse</span><span style="color: #007700">(</span><span style="color: #0000BB">client</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">args</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">args</span><span style="color: #007700">&#91;</span><span style="color: #0000BB">0</span><span style="color: #007700">&#93;.</span><span style="color: #0000BB">equalsIgnoreCase</span><span style="color: #007700">(</span><span style="color: #DD0000">"Kolloid"</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">client</span><span style="color: #007700">.print(</span><span style="color: #DD0000">"...stinkt&nbsp;sehr."</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />if&nbsp;(</span><span style="color: #0000BB">args</span><span style="color: #007700">&#91;</span><span style="color: #0000BB">0</span><span style="color: #007700">&#93;.</span><span style="color: #0000BB">equalsIgnoreCase</span><span style="color: #007700">(</span><span style="color: #DD0000">"test"</span><span style="color: #007700">))&nbsp;{&nbsp;</span><span style="color: #FF8000">//&nbsp;Name&nbsp;des&nbsp;Commands<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">client</span><span style="color: #007700">.print(</span><span style="color: #DD0000">"°R°_°&gt;p1rates|/w&nbsp;p1&lt;°&nbsp;(privat):&nbsp;§Testcommand!"</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;"°R°_°&gt;p1rates|/w&nbsp;p1&lt;°&nbsp;(privat):"&nbsp;ist&nbsp;nur&nbsp;dafür&nbsp;da&nbsp;um&nbsp;es&nbsp;Privat&nbsp;darzustellen,&nbsp;das&nbsp;alles&nbsp;ist&nbsp;der&nbsp;Text&nbsp;der&nbsp;ausgegeben&nbsp;wird.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">args</span><span style="color: #007700">&#91;</span><span style="color: #0000BB">0</span><span style="color: #007700">&#93;.</span><span style="color: #0000BB">equalsIgnoreCase</span><span style="color: #007700">(</span><span style="color: #DD0000">"popup"</span><span style="color: #007700">))&nbsp;{&nbsp;</span><span style="color: #FF8000">//&nbsp;Name&nbsp;des&nbsp;Commands<br /></span><span style="color: #007700">new&nbsp;</span><span style="color: #0000BB">Packages</span><span style="color: #007700">.</span><span style="color: #0000BB">Popup</span><span style="color: #007700">.</span><span style="color: #0000BB">showPopup</span><span style="color: #007700">(</span><span style="color: #DD0000">"POPUP-TEST"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"Popup"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"PopUp-Test&nbsp;°&gt;sm_00.gif&lt;°§"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">400</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">200</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">client</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;"Popup-Test"&nbsp;ist&nbsp;der&nbsp;Name&nbsp;des&nbsp;Fensters&nbsp;"Popup"&nbsp;ist&nbsp;der&nbsp;Text&nbsp;der&nbsp;oben&nbsp;auf&nbsp;Weißer&nbsp;fläche&nbsp;dargestellt&nbsp;wird.&nbsp;"400,200"&nbsp;ist&nbsp;die&nbsp;Beite&nbsp;und&nbsp;Höhe&nbsp;des&nbsp;Popupfensters.<br /></span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />}&nbsp;<br /></span><span style="color: #0000BB"></span>
</span>
</code></code><hr />
</div><b><br />
<br />
Und Bitte, macht bitte kein C&amp;P, sondern lernt auch dazu.</b> <br />
<br />
Ich hoffe, dass ich Euch damit helfen konnte.<br />
<br />
Mit freundlichen Grüßen,<br />
© Bartek.</div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Angehängte Grafiken</legend>
				<div style="padding:10px">
				<img class="attach" src="https://u-labs.de/forum/attachment.php?attachmentid=6529&amp;stc=1&amp;d=1392071961" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>Bartek</dc:creator>
			<guid isPermaLink="true">tutorials-90/javascript-k-script-client-popups-ausgaben-hinzufuegen-29754</guid>
		</item>
		<item>
			<title><![CDATA[[K-TUT] QuizBot erstellen mit KNLib]]></title>
			<link>tutorials-90/k-tut-quizbot-erstellen-mit-knlib-29729?goto=newpost</link>
			<pubDate>Thu, 31 Mar 2011 17:13:13 GMT</pubDate>
			<description>Hi, 
da ich gesehen habe, dass jemand nachgefragt hat wegen dem QuizBot, möchte ich hier einige Snippets einstellen, die hilfreich sind. 
 
 
_1....</description>
			<content:encoded><![CDATA[<div>Hi,<br />
da ich gesehen habe, dass jemand nachgefragt hat wegen dem QuizBot, möchte ich hier einige Snippets einstellen, die hilfreich sind.<br />
<br />
<br />
<u><i>1. Quiz.php (Suchfunktion) runterladen</i></u><br />
<br />
Erstmal musst du eine QuizURL erstellen. Dazu uploadest du die Quiz.hp (SUFU!) und gibst im PHPmyAdmin den Befehl für die QuizURL ein. Oder du fragst rum ob jemand eine QuizURL für dich hat! :-)<br />
<br />
<i><u>2. Frage von James regexxen<br />
<br />
</u></i>Zuerst musst du die Frage von James regexxen<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">&nbsp;frage&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">Regex</span><span style="color: #007700">.</span><span style="color: #0000BB">Match</span><span style="color: #007700">(</span><span style="color: #0000BB">token</span><span style="color: #007700">(</span><span style="color: #0000BB">3</span><span style="color: #007700">),&nbsp;</span><span style="color: #DD0000">"°B18°_(.+)_°r°"</span><span style="color: #007700">).</span><span style="color: #0000BB">Groups</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">).</span><span style="color: #0000BB">Value&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Jetzt weißt du die Frage und kannst sie z.B. in einer TextBox speichern.<br />
<br />
<u><i>3. QuizURL Abfrage senden<br />
<br />
</i></u>Wir nehmen an, dass die QuizURL folgende ist: &quot;http://k-script.cc/quiz.php&quot;.<br />
<br />
Um eine Frage manuell abzufragen, musst du folgendes in deinem Browser eingeben:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">k</span><span style="color: #007700">-</span><span style="color: #0000BB">script</span><span style="color: #007700">.</span><span style="color: #0000BB">cc</span><span style="color: #007700">/</span><span style="color: #0000BB">quiz</span><span style="color: #007700">.</span><span style="color: #0000BB">php</span><span style="color: #007700">?</span><span style="color: #0000BB">action</span><span style="color: #007700">=</span><span style="color: #0000BB">get</span><span style="color: #007700">&amp;</span><span style="color: #0000BB">q</span><span style="color: #007700">=</span><span style="color: #0000BB">frage&nbsp;<br /></span>
</span>
</code></code><hr />
</div>Dies kann man nun einwandfrei im Programm einbauen!<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">PHP-Code:</div>
	<hr /><code class="bbcode_code"><code><span style="color: #000000">
<span style="color: #0000BB">&nbsp;Dim&nbsp;antwort&nbsp;</span><span style="color: #007700">As&nbsp;</span><span style="color: #0000BB">String&nbsp;</span><span style="color: #007700">=&nbsp;(New&nbsp;</span><span style="color: #0000BB">Net</span><span style="color: #007700">.</span><span style="color: #0000BB">WebClient</span><span style="color: #007700">().</span><span style="color: #0000BB">DownloadString</span><span style="color: #007700">(</span><span style="color: #DD0000">"k-script.cc/quiz.php?action=get&amp;q="&nbsp;</span><span style="color: #007700">&amp;&nbsp;</span><span style="color: #0000BB">frage&nbsp;<br /></span>
</span>
</code></code><hr />
</div><br />
<br />
<b>Nun muss man nur noch die Frage in eine TextBox einfügen.<br />
Dies ist nur eine Anlaufhilfe!<br />
<br />
</b><br />
Viel Spaß!<br />
iBlack</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>iBlack</dc:creator>
			<guid isPermaLink="true">tutorials-90/k-tut-quizbot-erstellen-mit-knlib-29729</guid>
		</item>
		<item>
			<title>Billard (9-Ball) Bot</title>
			<link>tutorials-90/billard-9-ball-bot-29730?goto=newpost</link>
			<pubDate>Fri, 18 Mar 2011 18:52:52 GMT</pubDate>
			<description>Da mir hierzu die Zeit und Lust fehlt verrat ich euch wie mein Billard Bot funktioniert, dann kann sich ja auch mal jemand anders dran versuchen....</description>
			<content:encoded><![CDATA[<div>Da mir hierzu die Zeit und Lust fehlt verrat ich euch wie mein Billard Bot funktioniert, dann kann sich ja auch mal jemand anders dran versuchen. Aber kommt nicht auf die Idee mit Hilfe meiner Informationen einen Bot zu basteln und diesen dann zu verkaufen.<br />
Die Idee ist ganz simpel, man simuliert einfach ein Spiel: Man loggt 2 Nicknamen im Channel 9-Ball ein, einen natürlich via Proxy. Spieler 1 öffnet ein neues Spiel, Spieler 2 tritt ein, Spieler 1 startet das Spiel. Ist Spieler 1 an der Reihe macht er den Königsstoß, ist Spieler 2 an der Reihe begeht er einen Foul damit Spieler 1 an der Reihe ist, dann macht dieser wieder den Königsstoß. Man kann auch beide den Königsstoß machen lassen wenn man die Punkte gerecht verteilen will, ist aber weniger sinnvoll. Nachdem das Spiel vorbei ist bestätigen beide Spieler, dass sie noch einmal spielen wollen. Wichtig ist, dass der Spieler, der den Königsstoß ausführt, ca. 30 Sekunden wartet bevor er dies tut, sonst gibt es gerade mal 1 Punkt.<br />
Um <b>bis zu 500+ Punkte / Minute</b> zu erreichen muss man das Billard-Limit und das Channel-Limit &quot;bypassen&quot; (umgehen). Zuerst sucht der Bot den 9-Ball-Channel mit der geringsten Population aus, dann loggt er Spieler 1 ein (ohne Proxy). Danach loggt der Bot weitere Spieler (mit Proxy) im selben Channel ein, am besten bis der Channel voll ist. Dann öffnen alle weiteren Spieler ein neues Spiel mit Betrittskontrolle, Spieler 1 tritt jedem Spiel bei, erst wenn er alle Spiele beigetreten hat werden die Anfragen von den anderen Spielern akzeptiert. Dadurch, dass die Spiele nicht von Spieler 1 eröffnet wurden, hat man das Billard-Limit umgangen. Dadurch, dass die Anfragen erst akzeptiert wurden nachdem man alle Spiele beigetreten hat, hat man das Channel-Limit umgangen (diesen Bug hat Ali gefunden). Und wer sich jetzt etwas geschickt anstellt schafft es auch in bis zu 20 Spielen gleichzeitig zu spielen ohne vom Server gekickt zu werden, kleiner Tipp: Timeout auf lang stellen.<br />
<br />
Ein Spielstart und einen Foul zu simulieren solltet ihr ja noch selber hinkriegen, den Königsstoß (großes Dankeschön an Johnny, der dafür <br />
viel Zeit für mich geopfert hat) hab ich für euch schon geloggt:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">b\0BILLARD_ID\0b\09\01351.0885235293317\0-281.4885614620557\0-133.32351868748881<br />
b\0BILLARD_ID\0a\032\01\00\09\01\00\02\01\02\04\01\00\01\01\04\06\01\06\07\01\01\03\01\00\09\01\03\05\01\05\06\01\02\08\01\00\01\01\01\08\02\04\01\02\07\016\02\04\016\01\04\08\01\04\05\02\07\013\01\01\04\02\05\016\02\03\013\01\04\05\02\03\016\02\09\01\03\05\028\02\04\013\03\05\032\02\08\08\04\08\03\02\01\013\04\07\02\0173.87448089616535\0180.1360081643251\0301.94548868562856\0319.8297799721764\0142.0796241619943\0128.91093717632114\080.59166953172453\0261.3320826816378\0209.82758851912536\0270.86570125659506\066.8262917573852\0298.82576774953236\0119.72123774812964\0145.03626723480312\0-1\0-1\0-1\0-1\0333.6948428583014\097.18263518727728</code><hr />
</div>(Ersteres ist der Movement, zweiteres das Resultat. Der Movement failt manchmal, trotzdem ist das Spiel gewonnen.)<br />
<br />
Ich werde keine Hilfestellung geben, wenn ihr mit diesen Informationen nicht klar kommt, dann lasst es einfach sein und versucht euch an was anderem.</div>

]]></content:encoded>
			<category domain="tutorials-90">Tutorials</category>
			<dc:creator>Flav</dc:creator>
			<guid isPermaLink="true">tutorials-90/billard-9-ball-bot-29730</guid>
		</item>
	</channel>
</rss>
