Thema: Kann man das so stehen lassen ?

03.04.16 20:23 #1

L4ZUR812

Registriert seit: 15.03.2014

Beiträge: 1

-

Hallo,
eigentlich bin ich gerade dabei, Java zu lernen und habe sowohl dazu, als auch zu C# das Buch im Regal stehen. Ich habe einen TS3-Server auf einem Root-Server laufen und höre von anderen oft beschwerden, dass niemand online ist. Da kam mir der Gedanke, den Usern einen Anreiz zu geben, online zu sein... Mit einem Teamspeaklevelsystem. Mir erschien ein PHP-Script mit einem regelmäßigen Cronjob am einfachsten, weil ich zuvor auf das TS3-PHP-Framework gestoßen bin. Also habe ich mich, obwohl noch nie mit PHP gearbeitet, an mein bescheidenes Vorhaben gesetzt. Ich kann behaupten, dass dieses Projekt bis jetzt mein umfangreichstes war, weil ich wusste, wo ich hin will und was ich brauche. Das Script soll einfach regelmäßig die Verbindungszeiten in eine Datenbank aktualisieren, diese dann wiederum regelmäßig abfragen und auf Basis dieser und der Anzahl der Gruppen Zeitlimits für ein Levelup setzen und die Benutzer befördern. Bevor ich mich verquassel, hier ist einmal der Code:

Das Script, das vom Cronjob ausgeführt wird:

Quellcode ausblenden PHP-Code
<?php
/*
 * Program developed by L4ZUR812.
 * This program is using TS3-phpframework by Doxygen.
 */
require_once ('libraries/TeamSpeak3/TeamSpeak3.php');
require ('dbmanager.php');
require ('assignment.php');
$server = array (
		"tsip" => "127.0.0.1",
		"tsport" => "****",
		"ts_query_admin" => "*******",
		"ts_query_password" => "*********",
		"ts_query_port" => "********",
		"ts_query_user_nick" => "*********" 
);

try {
	
	TeamSpeak3::init ();
	$ts3_VirtualServer = TeamSpeak3::factory ( "serverquery://" . $server ["ts_query_admin"] . ":" . $server ["ts_query_password"] . "@" . $server ["tsip"] . ":" . $server ["ts_query_port"] . "/?server_port=" . $server ["tsport"] . "&nickname=" . $server ["ts_query_user_nick"] . "" );
	
	$uids = array ();
	$creator = new dbmanager ();
	$creator->createTable ();
	$assigner = new assignment ();
	$clientList = $ts3_VirtualServer->clientList ( array () );
	// expressable as new function (parseClientlist) with switch:case.
	foreach ( $clientList as $client ) {
		$clientuid = $client->getProperty ( 'client_unique_identifier' );
		$clientdbid = $client->getProperty ( 'client_database_id' );
		$milliseconds = $client->getProperty ( 'connection_connected_time' );
		$minutes = round ( $milliseconds / (60000), 2 );
		$creator->createEntry ( $clientuid, $client );
		$creator->updateOnline ( $clientuid, round ( $minutes ), $client );
		array_push ( $uids, $clientuid );
		$time = $creator->getUsertime ( $clientuid );
		$assigner->assign ( $ts3_VirtualServer, $clientuid, $clientdbid, $time );
	}
	$creator->listdb ( $uids );
	$creator->updateOffline ();
} catch ( Exception $e ) {
	echo "Fehler!<br/>ErrorID: <b>" . $e->getCode () . "</b>; Error Message: <b>" . $e->getMessage () . "</b>;";
}
function format(&$minutes, &$client) {
	$seconds = round ( round ( $minutes - floor ( $minutes ), 2 ) * 60 );
	if ($seconds < 10) {
		$seconds = "0" . $seconds;
	}
	$minutesstring = $client . "'s Exact onlinetime: " . floor ( $minutes ) . ":" . $seconds . "m\n";
	echo $minutesstring;
}
?>


Und schließlich die Gruppe zur Datenbankverwaltung:

Quellcode ausblenden PHP-Code
<?php
class dbmanager {
	var $user = "*********";
	var $password = "**********";
	var $database = "**********";
	var $server = "127.0.0.1";
	var $clientsOnline = array (); // may be usefull in future development. But not used yet.
	var $clientsOffline = array ();
	function listdb(&$uidsOnline) {
		$db_handle = mysql_connect ( $this->server, $this->user, $this->password );
		$db_found = mysql_select_db ( $this->database, $db_handle );
		$uidsAvailable = array ();
		if ($db_found) {
			$SQL = "SELECT * FROM tb_times";
			$result = mysql_query ( $SQL );
			while ( $db_field = mysql_fetch_assoc ( $result ) ) {
				array_push ( $uidsAvailable, $db_field ['UID'] );
			}
			mysql_close ( $db_handle );
		} else {
			print "Database NOT Found ";
			mysql_close ( $db_handle );
		}
		$this->clientsOnline = array_intersect_key ( $uidsAvailable, $uidsOnline );
		$this->clientsOffline = array_diff ( $uidsAvailable, $uidsOnline );
	}
	function updateOnline(&$uid, &$newTime, &$client/*Not used yet. Will be used later if someone changes Nick, to keep table readable for humen*/){
		$oldTime;
		$accTime;
		$db_handle = mysql_connect ( $this->server, $this->user, $this->password );
		$db_found = mysql_select_db ( $this->database, $db_handle );
		$SQL = "SELECT * FROM tb_session";
		$result = mysql_query ( $SQL );
		while ( $db_field = mysql_fetch_assoc ( $result ) ) {
			if (strcmp ( $db_field ['UID'], $uid ) == 0) {
				$oldTime = $db_field ['New_time'];
			}
		}
		$addTime = $newTime - $oldTime;
		$SQL = "UPDATE tb_session SET Add_time='" . $addTime . "' WHERE UID='" . $uid . "';";
		mysql_query ( $SQL );
		$SQL = "UPDATE tb_session SET New_time='" . $newTime . "' WHERE UID='" . $uid . "';";
		mysql_query ( $SQL );
		$SQL = "UPDATE tb_session SET Old_time='" . $oldTime . "' WHERE UID='" . $uid . "';";
		mysql_query ( $SQL );
		
		$SQL = "SELECT * FROM tb_times";
		$result = mysql_query ( $SQL );
		while ( $db_field = mysql_fetch_assoc ( $result ) ) {
			if (strcmp ( $db_field ['UID'], $uid ) == 0) {
				$accTime = $db_field ['Minutes'];
				$accTime = $accTime + $addTime;
				$SQL = "UPDATE tb_times SET Minutes='" . $accTime . "' WHERE UID='" . $uid . "';";
				mysql_query ( $SQL );
			}
		}
	}
	function updateOffline() {
		$db_handle = mysql_connect ( $this->server, $this->user, $this->password );
		$db_found = mysql_select_db ( $this->database, $db_handle );
		$length = count ( $this->clientsOffline );
		
		for($i = 0; $i < $length; $i ++) {
			$uid = array_values ( $this->clientsOffline ) [$i];
			
			$SQL = "UPDATE tb_session SET Add_time='0' WHERE UID='" . $uid . "';";
			mysql_query ( $SQL );
			$SQL = "UPDATE tb_session SET New_time='0' WHERE UID='" . $uid . "';";
			mysql_query ( $SQL );
			$SQL = "UPDATE tb_session SET Old_time='0' WHERE UID='" . $uid . "';";
			mysql_query ( $SQL );
		}
	}
	function createTable() {
		$db_handle = mysql_connect ( $this->server, $this->user, $this->password );
		$db_found = mysql_select_db ( $this->database, $db_handle );
		if ($db_found) {
			$SQL = "CREATE TABLE `tb_times` (`UID` tinytext NOT NULL,`Name` tinytext NOT NULL,`Minutes` int NOT NULL);";
			mysql_query ( $SQL );
			$SQL = "ALTER TABLE `tb_times`ADD PRIMARY KEY `UID` (`UID`(25));";
			mysql_query ( $SQL );
			$SQL = "CREATE TABLE `tb_session` (`UID` tinytext NOT NULL,`Name` tinytext NOT NULL,`New_time` int NOT NULL,`Old_time` int NOT NULL, `Add_time` int NOT NULL);";
			mysql_query ( $SQL );
			$SQL = "ALTER TABLE `tb_session`ADD PRIMARY KEY `UID`(`UID`(25));";
			mysql_query ( $SQL );
		} else {
			print "Database NOT Found ";
			mysql_close ( $db_handle );
		}
	}
	function createEntry(&$UID, &$Name) {
		$db_handle = mysql_connect ( $this->server, $this->user, $this->password );
		$db_found = mysql_select_db ( $this->database, $db_handle );
		if ($db_found) {
			$SQL = "INSERT INTO `tb_times` (`UID`, `Name`, `Minutes`) VALUES ('" . $UID . "', '" . $Name . "', '0');";
			mysql_query ( $SQL );
			$SQL = "INSERT INTO `tb_session` (`UID`, `Name`, `New_time`,`Old_time`) VALUES ('" . $UID . "', '" . $Name . "', '0', '0');";
			mysql_query ( $SQL );
		} else {
			print "Database NOT Found ";
			mysql_close ( $db_handle );
		}
	}
	function getUsertime(&$uid) {
		$db_handle = mysql_connect ( $this->server, $this->user, $this->password );
		$db_found = mysql_select_db ( $this->database, $db_handle );
		$time = 0;
		if ($db_found) {
			$SQL = "SELECT * FROM tb_times";
			$result = mysql_query ( $SQL );
			while ( $db_field = mysql_fetch_assoc ( $result ) ) {
				if (strcmp ( $db_field ['UID'], $uid ) == 0) {
					$time = $db_field ['Minutes'];
				}
			}
		} else {
			print "Database NOT Found ";
			mysql_close ( $db_handle );
		}
		return $time;
	}
}
?>



Die Assignment-Klasse:
Quellcode ausblenden PHP-Code
<?php
/* übernimmt die Einordnung der Benutzer in die Gruppen*/
class assignment {
	var $servergroups = array ();
	var $servergroupIds = array ();
	var $timeRequired = array (); // durch späteres webinterface auffüllbar anhand von count($servergroups) und eine Settermethode
	var $maxGroups = 9;
	var $user = "*****";
	var $password = "******";
	var $database = "*****";
	var $server = "127.0.0.1";
	var $exceptions = array (
			"hfM3qfLCeqUm24ilNc13epgpqLg=",
			"iCiHShSn80EbgFtdS9kLVrTaoI8=",
			"" 
	); // liste der levelausgenommenen User
	function assign(&$ts3_VirtualServer, &$uid, &$dbid, &$conTime) {
		$db_handle = mysql_connect ( $this->server, $this->user, $this->password );
		$db_found = mysql_select_db ( $this->database, $db_handle );
		// bestimmt die Größe und den Inhalt des $servergroups
		$this->servergroups = $ts3_VirtualServer->serverGroupList ();
		foreach ( $this->servergroups as $sgid => $this->servergroup ) {
			if ($this->servergroup ["type"] != TeamSpeak3::GROUP_DBTYPE_REGULAR) {
				unset ( $this->servergroups [$sgid] );
			} else {
				if (count ( $this->servergroupIds ) != $this->maxGroups) {
					array_push ( $this->servergroupIds, $this->servergroup ["sgid"] );
				}
			}
		}
		foreach ( $this->servergroupIds as $sgid ) {
			if (count ( $this->timeRequired ) != $this->maxGroups) {
				$timeRequired = (($this->maxGroups + 5 - $sgid) * ($this->maxGroups + 5 - $sgid)) * 10;
				array_push ( $this->timeRequired, $timeRequired );
			}
		}
		// var_dump($this->timeRequired);
		$i = 0;
		foreach ( $this->timeRequired as $limit ) {
			if ($limit == $conTime && ! in_array ( $uid, $this->exceptions )) { // Filterhinzufügen: wenn User noch nicht in besagter Gruppe
				$ts3_VirtualServer->serverGroupClientAdd ( $this->servergroupIds [$i], $dbid ); // später zwischen auf und abstieg unterscheiden!
				$ts3_VirtualServer->serverGroupClientDel ( $this->servergroupIds [($i + 1)], $dbid );
				break;
			}
			$i ++;
		}
	}
}
?>



Nun, da ich noch kein Profi bin, was das Programmieren im Allgemeinen betrifft, wollte ich fragen, wo bei dem Code optimierungsbedarf besteht.

Grüße, Lars

28.06.20 22:43 #2

GELÖSCHTE PERSON

Registriert seit: 0000-00-00 00:00:00

Beiträge: 0

-

In dem Code ist so ziemlich alles falsch, was man falsch machen kann.
Du solltest erstmal die Grundlagen lernen, bevor Du Dich an Projekte wagst.
Der Code ist kompletter Müll.
Hast Du den Code irgendwo her kopiert? Dieser Müll ist doch sicher mehr als 20 Jahre alt hat duzende Sicherheitslücken und Fehler.

1896089

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.

15ms