Du bist nicht angemeldet.

1

Samstag, 9. Juni 2012, 02:59

b-Packet (Channel-List)

Das b-Packet dient zur übertragung der derzeitig aktiven Channels.

Quellcode

1
b\0Lobby\n1\0p\0B\0-\0Mafia\n1\0p\0B\0-\0Billard\n1\0p\0B\0-


Das Packet ist relativ einfach aufgebaut. Neben dem optoken b besitzt das Paket mehrere Sektionen.
Ich zeig euch nun, wie man diese am besten parsen kann, da ich bei KS beispielsweise nur Trottel fand, die den Token über "\0-" erst gesplitted haben - Unnötig.

Wenn man sich das Paket genauer anschaut, mehrt man, dass jedem Channel 4 Tokens zustehen.

Quellcode

1
2
3
4
b
\0Lobby\n1\0p\0B\0-
\0Mafia\n1\0p\0B\0-
\0Billard\n1\0p\0B\0-


1: Channelname + Online-Nicks
2: Style-Angabe (p = plain, i =italic)
3: undefined
4: undefined

Anhand der vier Tokens können wir einfach über Modulo und länge des Gesamtpaketes (minus eins, da der Opcode ja nicht mitgezählt wird), bestimmen, wieviele Channels geparst werden sollen und welche Daten diese einzelnen Channels existieren:

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// wieviele Channels existieren im Paket?
int channel_count = (tokens.length - 1) / 4;

// Gehe alle Tokens durch
for(int j = 1; j < tokens.length; j++) {


	// anhand von Modulo wird hier jede "Channel-Sektion" auseinandergehalten
	if(j % 4 == 0) {
		String[] channel_name	= tokens[j - 3].split("\n");
		String channel_style	= tokens[j - 2];
		String channel_B		= tokens[j - 1];
		System.out.println(channel_name[0] + " (Online: " + channel_name[1] + ")");
	}
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Blizzard« (19. Februar 2013, 12:46)


2

Sonntag, 10. Juni 2012, 11:15

Da fehlt noch das Channel Icon das angezeigt wird wenn der Channel voll ist.

Java-Quelltext

1
b\0Alternative\n35\0p\0B\0pics/icon_fullChannel.gif\0-\0“\n31\0p\0B\0-\0Altstammis\n2\0i\0B\0-

3

Sonntag, 10. Juni 2012, 21:14

http://pastie.org/4063179

Ist in C#, kann man sich übersetzen.

MfG

4

Sonntag, 10. Juni 2012, 21:23

Hab es mal übersetzt


Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// Globale Variablen
			private static String ChannelName = "";
			private static int ChannelCount = 2;
			
			/** 
			 Erstellt eine ChannelList
			 
			 @param input Die Daten vom Server (b-Token)
			 @return ChannelList
			*/
			
			public static Channel[] ParseChannelList(String input)
			{
				
				// Splitte die Daten "-\0"
				String[] channelListParameters = input.split("-\0", 0);
				// Initalisiere eine neue Liste (Channel)
				java.util.ArrayList<Channel> channelList = new java.util.ArrayList<Channel>();
				// Gehe jeden Eintrag durch
				for (String parameter : channelListParameters)
					// Füge den Channel (ParseChannel gibt einen Channel zurück) in unsere List hinzu
				{
					channelList.add(ParseChannel(parameter));
				}
				// Gebe die Liste als Array zurück
				
				return channelList.toArray(new Channel[0]);
			}

			/** 
			 Erstellt einen Channel aus den dazugehörigen Parametern
			 
			 @param parameters Die Channelparameter
			 @return Channel
			*/
			static Channel ParseChannel(String parameters)
			{
				// Falls die aktuelle Daten mit b\0 anfangen (am Anfang: b\00-8-15...)
				if (parameters.startsWith("b\0"))
					// entfernen
				{
					parameters = parameters.replace("b\0", "");
				}
				// Wir splitten jetzt das \0	
				String[] channelParameters = parameters.split("\0", -1);
				/* In der ersten Stelle im Array befindet sich der Channelname und die Anzahl der Chatter, getrennt durch "\n"
				 * Dann splitten wir das "\n" und die erste Stelle davon ist der Channelname
				 */
				String channelname = channelParameters[0].split("\n", -1)[0];
				// Wenn der ChannelName " entspricht
				if (channelname.equals("""))
				{
					// Dann kriegt er den ursprünglichen Channelnamen und die Nummer
					channelname = String.format("%1$s %2$s", ChannelName, ChannelCount);
					// erhöhe die Nummer um 1
					ChannelCount++;
				}
				// Wenn der ChannelName aber " enthält
				else if (channelname.contains("""))
					/* Dann sieht es so aus: "5
					 * Das " ersetzen wir, erhalten somit die Nummer und der ChannelName ist der ursprüngliche Name und die Nummer
					 */
				{
					channelname = String.format("%1$s %2$s", ChannelName, channelname.replace(""", ""));
				}
				// Wenn es ein neuer Channel ist, der mit dem alten nichts zu tun hat
				else if (!ChannelName.equals(channelname))
				{
					// Setze die Nummer auf den Standartwert
					ChannelCount = 2;
					ChannelName = channelname;
				}
				// Ansonsten
				else
				{
					// Globale Variable erhält den aktuellen Channelnamen
					ChannelName = channelname;
				}
				// Anzahl der Chatter bestimmen (s.o.)
				int count = Integer.parseInt(channelParameters[0].split("[\\n]", -1)[1]);
				// Wenn ein Channel voll ist, wird in der vierten Stelle des Arrays das entsprechende Bild geliefert und wir prüfen, ob sich ein Teil davon dort befindet
				boolean isFull = channelParameters[3].contains("full");
				// Wenn im Channel mehr als 1 Chatter ist, ist er nicht leer, ansonsten schon
				boolean isEmpty = !(count > 1);
				// Format, wie der Channel angezeigt wird (i = italic, p = plain)
				char channelAppearanceFormatter =channelParameters[1].charAt(0);
				// neue Liste initialisieren
				java.util.ArrayList<String> images = new java.util.ArrayList<String>();
				// Pfad zur List hinzufügen, wenn es "pics" enthält
				if (channelParameters[3].contains("pics"))
				{
					images.add(channelParameters[3]);
				}
				// Gebe Channel zurück
				
				return new Channel(channelname, count, isFull, isEmpty, channelAppearanceFormatter, images);
			}




public final class Channel
		{
			private String _channelname;
			private int _chatter;
			private boolean _isFull;
			private boolean _isEmpty;
			private char _formatter;
			private ArrayList<String> _images;

			public String getChannelName()
			{
				return _channelname;
			}
			public int getChatter()
			{
				return _chatter;
			}
			public boolean getisFull()
			{
				return _isFull;
			}
			public boolean getisEmpty()
			{
				return _isEmpty;
			}
			public char getchannelAppearanceFormatter()
			{
				return _formatter;
			}
			public java.util.ArrayList<String> getImages()
			{
				return _images;
			}

			public Channel()
			{
			}

			public Channel(String name, int chatter, boolean full, boolean empty, char formatter, java.util.ArrayList<String> channelImages)
			{
				_channelname = name;
				_chatter = chatter;
				_isFull = full;
				_isEmpty = empty;
				_formatter = formatter;
				_images = channelImages;
			}

			public Channel clone()
			{
				Channel varCopy = new Channel();

				varCopy._channelname = this._channelname;
				varCopy._chatter = this._chatter;
				varCopy._isFull = this._isFull;
				varCopy._isEmpty = this._isEmpty;
				varCopy._formatter = this._formatter;
				varCopy._images = this._images;

				return varCopy;
			}
		}

5

Sonntag, 10. Juni 2012, 21:31

Typisch ^^

Ich zeig euch nun, wie man diese am besten parsen kann, da ich bei KS beispielsweise nur Trottel fand, die den Token über "\0-" erst gesplitted haben - Unnötig.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Blizzard« (19. Februar 2013, 12:37)