|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Misc::Off Topic Want to talk about something that has nothing to do with EverQuest or the emulator? Post here. |
|
|
|
07-10-2008, 02:32 PM
|
Discordant
|
|
Join Date: Oct 2005
Location: michigain
Posts: 260
|
|
php help
im trying to put in my website a who all online thingy.
i can list all the players online with a telnet connection but it outputs more info then i need
so i want to strip our everything i don't need and only keep what i do and i have always had problems with striping so i figured i would ask for help.
i am using this.
PHP Code:
fConnect($fp,$Server,$Port,$user,$pass);
fputs ($fp, "who\r");
usleep(125000);
while (!feof($fp))
{
$ret = fgets($fp);
if (ereg("zone", $ret)) {
echo "$ret \n <br>";
}
if (ereg("online", $ret)){
echo "$ret \n";
fclose($fp);
break;
}
}
and it outputs something like this
Code:
[59 Master] Yuari (Iksar) zone: sebilis AccID: 298 AccName: Flora LSID: 110561 Status: 0
1 player online
i want to strip out everything and make a table that says
level name race class zone
and then strips everything and places relevant info under the right catagory..
can someone help me with this?
Last edited by Cripp; 07-12-2008 at 04:13 AM..
Reason: changed to pvp tag instead of code! :) more pretty.
|
|
|
|
|
|
|
07-11-2008, 08:00 PM
|
Developer
|
|
Join Date: Mar 2007
Location: Ohio
Posts: 648
|
|
In general, you're probably going to want to use Regular Expressions, although it's gonna be a little complicated.
When I log into my GM character, this is everything that's returned with the "who" command in the telnet window:
Code:
* GM-Impossible * [ANON 70 Stone Fist] Xamlagar (Iksar) zone: poknowledge AccID: 13 AccName: AndMetal LSID: 87737 Status: 250
And this is what you get with a regular character (not sure about any leading spaces):
Code:
[59 Master] Yuari (Iksar) zone: sebilis AccID: 298 AccName: Flora LSID: 110561 Status: 0
The first issue is that the string doesn't have the same delimiters every time. You could use explode with a space as the delimiter to start separating it, but because several items can be multiple words (class & race off the top of my head), that doesn't really help. So, back to regular expressions.
First, we'll start by pulling just the character info:
PHP Code:
fConnect($fp,$Server,$Port,$user,$pass);
fputs ($fp, "who\r"); usleep(125000);
while (!feof($fp)) { $ret[++$x] = fgets($fp); if (ereg("zone", $ret[$x])) { fclose($fp); break; }; };
So now we can work with $ret.
To separate any GM flag, you should be able to use this:
PHP Code:
preg_match("/\*.*\*/", $ret[1], $matches); $players[1][GM] = trim($matches[0], "* ");
This will return:
for the GM character & a blank for a regular character. You could then use the same idea for the rest. This is the script I came up with:
PHP Code:
foreach ($ret as $key => $value) { // GM Status if (preg_match("/\*.*\*/", $value, $matches)) { $players[$key][GM] = trim($matches[0], "* "); }; // Role/Anon, Level, & Class if (preg_match("/\[.*\]/", $value, $matches)) { $tmp = explode(" ", trim($matches[0], "[] ")); if (!is_numeric($tmp[0])) { $players[$key][Visible] = $tmp[0]; $players[$key][Level] = $tmp[1]; $players[$key]["Class"] = rtrim($tmp[2] . " " . $tmp[3], " "); } else { $players[$key][Level] = $tmp[0]; $players[$key]["Class"] = rtrim($tmp[1] . " " . $tmp[2], " "); }; }; // Character's Name if (preg_match("/\].*\(/", $value, $matches)) { $players[$key][Name] = trim($matches[0], "] ("); }; // Race if (preg_match("/\(.*\)/", $value, $matches)) { $players[$key][Race] = trim($matches[0], "( )"); }; // Zone if (preg_match("/zone:.*AccID:/", $value, $matches)) { $players[$key][ZoneLong] = substr($matches[0], 6, -7); }; // Account ID if (preg_match("/AccID:.*AccName:/", $value, $matches)) { $players[$key][AcctID] = substr($matches[0], 7, -9); }; // Account Name if (preg_match("/AccName:.*LSID:/", $value, $matches)) { $players[$key][AcctName] = substr($matches[0], 9, -6); }; // Login Server ID if (preg_match("/LSID:.*Status:/", $value, $matches)) { $players[$key][LSID] = substr($matches[0], 6, -8); }; // Status if (preg_match("/Status:.*/", $value, $matches)) { $players[$key][Status] = substr($matches[0], 8, 3); }; };
Now you have a nice, simple array of all the characters that you can foreach to output to a table. The only thing missing would be anything that has to do with Guilds, but that should be easy enough to add.
I'm sure there's more efficient ways of doing this, especially if you can pull just what you're looking for the with Regular Expression instead of everything around it, but this will at least get the job done.
Hope this helps.
|
|
|
|
07-12-2008, 04:05 PM
|
Discordant
|
|
Join Date: Oct 2005
Location: michigain
Posts: 260
|
|
ok i tried doing a print_r($players); and got an error.
Warning: Invalid argument supplied for foreach() in E:\wamp\www\who.php on line 46
for each player online
btw this is after adding to my code so line 46 is the first line there.
foreach ($ret as $key => $value) {
what should i do and am i calling the print_r($players); correctly or should i do something else. im trying to print it so i can see all the values of the array so i can place them in the right tables
|
|
|
|
07-14-2008, 12:16 AM
|
Developer
|
|
Join Date: Mar 2007
Location: Ohio
Posts: 648
|
|
For some reason, my Telnet code made sense the other day, but after looking at it now, I'm not sure where me head was
Here is the entire script I put together for testing:
PHP Code:
<?php
$ret[1] = " * GM-Impossible * [ANON 70 Stone Fist] Xamlagar (Iksar) zone: poknowledge AccID: 13 AccName: AndMetal LSID: 87737 Status: 250";
$ret[2] = " [59 Master] Yuari (Iksar) zone: sebilis AccID: 298 AccName: Flora LSID: 110561 Status: 0";
$ret[3] = " [70 Performer] Keasi (Half Elf) zone: poknowledge AccID: 1777 AccName: Keasi LSID: 69583 Status: 0";
$ret[4] = " [70 Vanquisher] Suddz (Iksar) zone: cabeast AccID: 1780 AccName: OcelotRX LSID: 110949 Status: 0";
echo "<pre>\n\$ret = ";
print_r($ret);
echo "\n</pre>\n";
foreach ($ret as $key => $value) {
// GM Status
if (preg_match("/\*.*\*/", $value, $matches)) {
$players[$key][GM] = trim($matches[0], "* ");
};
// Role/Anon, Level, & Class
if (preg_match("/\[.*\]/", $value, $matches)) {
$tmp = explode(" ", trim($matches[0], "[] "));
if (!is_numeric($tmp[0])) {
$players[$key][Visible] = $tmp[0];
$players[$key][Level] = $tmp[1];
$players[$key]["Class"] = rtrim($tmp[2] . " " . $tmp[3], " ");
} else {
$players[$key][Level] = $tmp[0];
$players[$key]["Class"] = rtrim($tmp[1] . " " . $tmp[2], " ");
};
};
// Character's Name
if (preg_match("/\].*\(/", $value, $matches)) {
$players[$key][Name] = trim($matches[0], "] (");
};
// Race
if (preg_match("/\(.*\)/", $value, $matches)) {
$players[$key][Race] = trim($matches[0], "( )");
};
// Zone
if (preg_match("/zone:.*AccID:/", $value, $matches)) {
$players[$key][ZoneLong] = substr($matches[0], 6, -7);
};
// Account ID
if (preg_match("/AccID:.*AccName:/", $value, $matches)) {
$players[$key][AcctID] = substr($matches[0], 7, -9);
};
// Account Name
if (preg_match("/AccName:.*LSID:/", $value, $matches)) {
$players[$key][AcctName] = substr($matches[0], 9, -6);
};
// Login Server ID
if (preg_match("/LSID:.*Status:/", $value, $matches)) {
$players[$key][LSID] = substr($matches[0], 6, -8);
};
// Status
if (preg_match("/Status:.*/", $value, $matches)) {
$players[$key][Status] = substr($matches[0], 8, 3);
};
};
echo "<pre>\n\$players = ";
print_r($players);
echo "\n</pre>\n";
?>
And it works fine. However, it doesn't look like the Telnet code I suggested is putting out the array $ret, which is why it's freaking out at the foreach. Try this instead:
PHP Code:
fConnect($fp,$Server,$Port,$user,$pass);
fputs ($fp, "who\r");
usleep(125000);
while (!feof($fp)) {
$ret_tmp = fgets($fp);
if (ereg("zone", $ret_tmp)) {$ret[++$x] = $ret_tmp;};
if (ereg("online", $ret_tmp)) {break;};
};
fclose($fp);
That should put just the players into $ret & skip everything else, instead of just stopping the while loop & not outputting anything useful.
|
|
|
|
07-14-2008, 07:56 AM
|
Discordant
|
|
Join Date: Oct 2005
Location: michigain
Posts: 260
|
|
ok this is working but i cant figeur out how to call the arrays to put them wher ei want them in a table
i tried echo $players["Class"]; and echo $players[1]; and echo $players["Class"][1];
nothing is working.
|
07-14-2008, 08:55 AM
|
Discordant
|
|
Join Date: Oct 2005
Location: michigain
Posts: 260
|
|
nvm i got it working $players[1]['Class']; where q is the player and 'class' is what im looking for..
i do see a problem though it messes up if there zoneing. i would just check if there zoneing and put zoneing in all the fields but the name messes up also so i cant say there name.. is there a way to put in a zoneing check of the name at lest?
|
07-14-2008, 09:15 AM
|
Discordant
|
|
Join Date: Oct 2005
Location: michigain
Posts: 260
|
|
this is what i see when someone is zoneing
Code:
$ret = Array
(
[1] => [33 Shadowknight] Darkelf (Dark Elf) zone: qrg AccID: 250 AccName: noidster5 LSID: 112420 Status: 0
[2] => [56 Conjurer] Divad (Erudite) zone: veksar AccID: 141 AccName: lordraydin LSID: 109711 Status: 0
[3] => [0 Unknown] Everyone (Unknown) zone: (null) AccID: 319 AccName: dhgoyer LSID: 112843 Status: 0
)
Level Class Name Race Zone
33 Shadowknight Darkelf Dark Elf qrg
56 Conjurer Divad Erudite veksar
0 Unknown Everyone (Unknown) zone: Unknown) zone: (null (null)
3 players online
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -4. The time now is 08:06 PM.
|
|
|
|
|
|
|
|
|
|
|
|
|