From 9a61d1eabceccafd1eadf05943b78cfd24c115cf Mon Sep 17 00:00:00 2001 From: hecht Date: Sun, 10 Sep 2017 14:47:33 +0000 Subject: [PATCH] added handling of inverse auctions --- cronjob/generic_turnier.php | 4 - cronjob/generic_turnier_auswertung.php | 47 +-- cronjob/viertelstunde.php | 460 ++++++++++++++----------- 3 files changed, 286 insertions(+), 225 deletions(-) diff --git a/cronjob/generic_turnier.php b/cronjob/generic_turnier.php index 74118a9..0380085 100644 --- a/cronjob/generic_turnier.php +++ b/cronjob/generic_turnier.php @@ -217,10 +217,6 @@ if($gain == 'Anmeldung'){ // echo $sql.'
'; $qry = db_query($sql); while(($row = mysqli_fetch_assoc($qry)) && count($cid) < $anzahl){ - - // exclude winners of old tournaments in case requested - // exclude fusions that have participated multiple times in tournaments in case requested - // echo $row['id'].'
'; $cid[] = $row['id']; } diff --git a/cronjob/generic_turnier_auswertung.php b/cronjob/generic_turnier_auswertung.php index 8444a68..220e23b 100644 --- a/cronjob/generic_turnier_auswertung.php +++ b/cronjob/generic_turnier_auswertung.php @@ -16,36 +16,43 @@ include('path.inc.php'); include_once (ROOT_PATH.'/include/sqlwrapper.inc.php'); include_once (ROOT_PATH.'/include/event.inc.php'); include_once (ROOT_PATH.'/include/halloffame.inc.php'); +include_once (ROOT_PATH.'/include/tournament.inc.php'); + +// First run schedule tournaments +runScheduledTournaments(); $tournaments = array(); $tournament_event_ids = array(); -$qry = db_query('SELECT * FROM turniere WHERE ausgewertet = FALSE'); +$qry = db_query('SELECT * FROM tournament WHERE ausgewertet = FALSE'); while ($row = mysqli_fetch_assoc($qry)) { $tournament_event_ids[] = $row['event_id']; $tournaments[$row['event_id']] = $row; } -$sql = 'select event_id, MAX(visible) < now() as done, MAX(event_fight_id) as final_fight_id FROM event_fights WHERE event_id IN ('.join(',', $tournament_event_ids).') GROUP BY event_id'; -$qry = db_query($sql); - -$tournaments_done = array(); - -while ($row = mysqli_fetch_assoc($qry)) { - if ($row['done']) { - $event_id = $row['event_id']; - $tournament = $tournaments[$event_id]; - // determine the winner of the tournament ... - $final_fight = getEventFight($event_id, $row['final_fight_id']); - $winner_char = getEventChar($event_id, $final_fight['winner']); - $row = mysqli_fetch_assoc(db_query('Select max(id) as round from online')); - - insertIntoHallOfFameFull($row['round'], $tournament['art'], $winner_char['char_id'], $winner_char['char_name'], $winner_char['user_id'], $winner_char['user_name'], '\''.$tournament['datum'].'\'', $tournament['id']); - $tournaments_done[] = $tournament['id']; +if (count($tournaments) > 0) { + $sql = 'select event_id, MAX(visible) < now() as done, MAX(event_fight_id) as final_fight_id FROM event_fights WHERE event_id IN ('.join(',', $tournament_event_ids).') GROUP BY event_id'; + $qry = db_query($sql); + + $tournaments_done = array(); + + while ($row = mysqli_fetch_assoc($qry)) { + if ($row['done']) { + $event_id = $row['event_id']; + $tournament = $tournaments[$event_id]; + $tournament_type = getTournamentType($tournament['type']); + // determine the winner of the tournament ... + $final_fight = getEventFight($event_id, $row['final_fight_id']); + $winner_char = getEventChar($event_id, $final_fight['winner']); + $row = mysqli_fetch_assoc(db_query('Select max(id) as round from online')); + + insertIntoHallOfFameFull($row['round'], $tournament_type['name'], $winner_char['char_id'], $winner_char['char_name'], $winner_char['user_id'], $winner_char['user_name'], '\''.$tournament['datum'].'\'', $tournament['id']); + $tournaments_done[] = $tournament['id']; + } } -} -if (count($tournaments_done) > 0) { - db_query('UPDATE turniere SET ausgewertet = TRUE WHERE id IN ('.join(',', $tournaments_done).')'); + if (count($tournaments_done) > 0) { + db_query('UPDATE tournament SET ausgewertet = TRUE WHERE id IN ('.join(',', $tournaments_done).')'); + } } diff --git a/cronjob/viertelstunde.php b/cronjob/viertelstunde.php index 55eec50..daacc7c 100644 --- a/cronjob/viertelstunde.php +++ b/cronjob/viertelstunde.php @@ -1,213 +1,271 @@ -'; - } - return $tmp; -} - - -// Handelt eine einzelne Auktion ab -// @Return nichts -function bearbeiteAbgelaufeneAuktion($auktionsid){ -// echo '
bearbeite '.$auktionsid.'
'; - - $qry = database_query('SELECT u.nickname AS anbietername, u2.nickname AS bietername, a.auktionsid,a.anbieter,a.bieter,a.itemid,a.itemname,a.tablename,a.anzahl,a.startgebot,a.aktuellesgebot,a.deadline,a.startdate,a.cheatingverdacht, TIMESTAMPDIFF(Minute,now(),deadline) AS zeitdifferenz FROM auktion AS a INNER JOIN user as u ON a.anbieter = u.id LEFT JOIN user as u2 ON a.bieter = u2.id WHERE auktionsid = '.$auktionsid); - if(mysqli_num_rows($qry) == 0){ return NULL; } - $result = mysqli_fetch_assoc($qry); - $itemreceiver = ''; - - // Nun muss geprüft werden, ob überhaupt jemand geboten hat! - if($result['bieter'] == NULL){ // Wenn nicht, dann geht das item an den anbieter - $itemreceiver = $result['anbieter']; - } - else{ - // Ansonsten geht das Item an den Bietenden - $itemreceiver = $result['bieter']; - // Aber erst muss das Geld überwiesen werden - $erhalten = ceil($result['aktuellesgebot'] * 0.99); - $gebuehr = $result['aktuellesgebot'] - $erhalten; - - database_query('UPDATE user SET geld = geld - '.$result['aktuellesgebot'].' WHERE id = '.$result['bieter']); - database_query('UPDATE user SET geld = geld + '.$erhalten.' WHERE id = '.$result['anbieter']); - - if($result[cheatingverdacht] == 0){ // Wenn cheatingverdacht nicht besteht, dann pruefe ob Verdacht besteht!! - $avgprice = getAveragePrice($result[itemid], $result[tablename], $result[anzahl]); - if($avgprice != 0 && $avgprice * 1.2 < $result['aktuellesgebot'] && $result['anbieter'] != 1){ - $result[cheatingverdacht] = 1; - } - } - - //Transaktion verbuchen - $test = 'INSERT INTO auktion_transaktionen (anbieter, bieter, itemid, tablename, anzahl, betrag, deadline,cheatingverdacht) VALUES('.$result['anbieter'].','.$result['bieter'].','.$result['itemid'].',\''.$result['tablename'].'\','.$result['anzahl'].','.$result['aktuellesgebot'].',\''.$result['deadline'].'\','.$result['cheatingverdacht'].')'; - database_query($test); - //echo '

'.$test.'

'; - } - $anzahl = $result['anzahl']; - $item_row_name = 'item'; - if($result['tablename'] == 'ware'){$item_row_name = 'item_id';} +'; + } + return $tmp; +} + +function bearbeiteAbgelaufeneInverseAuktion($auktion) { + $item = array('table_name' => $auktion['tablename'], 'id' => $auktion['itemid']); + + $min_max = mysqli_fetch_row(db_query('SELECT min(range_from), max(range_to) from inverse_auktion_gebote WHERE auktionsid = '.$auktion['auktionsid'])); + echo '

Min: '.$min_max[0].', Max: '.$min_max[1].'

'; + + $winner = NULL; + $cost = NULL; + if ($min_max[0] != NULL) { + for ($i = $min_max[0]; $i <= $min_max[1]; ++$i) { + $row = mysqli_fetch_row(db_query('SELECT distinct(bieter), count(*) from inverse_auktion_gebote WHERE auktionsid = '.$auktion['auktionsid'].' AND '.$i.' between range_from and range_to')); + if ( $row[1] == 1 ) { + // we have a winner!!! + echo '

Spieler '.$row[0].' hat die inverse auktion mit dem betrag '.$i.' gewonnen!

'; + $winner = $row[0]; + $cost = $i; + break; + } + } + } + + $message_suffix = '"'.$auktion['itemname'].'" ('.$auktion['anzahl'].'x): Auktion von '.$auktion['anbietername'].' mit Deadline '.$auktion['deadline'].'.'; + $lose_message = NULL; + if ($cost === NULL) { + $lose_message = 'Leider gab ein kein kleinstes einmaliges Gebot. Das item wurde deshalb nicht versteigert!'; + } else { + $lose_message = 'Leider hat jemand anderes das kleinste einmalige Gebot abgegeben. Das item wurde für '.displayMoney($cost).' versteigert'; + } + + db_query('DELETE FROM auktion WHERE auktionsid = '.$auktion['auktionsid']); + + $qry = db_query('SELECT bieter FROM inverse_auktion_gebote WHERE auktionsid = '.$auktion['auktionsid']); + while ($row = mysqli_fetch_row($qry)) { + if ($winner != $row[0]) { + sendMessage('Auktionsmarkt', $row[0], 'Inverse Versteigerung verloren!', $lose_message.' '.$message_suffix); + } + } + + if ($winner !== NULL) { + createItemForUser($item, $winner, $auktion['anzahl']); + $msg = 'Herzlichen Glückwunsch, du hast die inverse Versteigerung (für '.displayMoney($cost).') gewonnen!'; + sendMessage('Auktionsmarkt', $winner, 'Inverse Versteigerung gewonnen!', $msg.' '.$message_suffix); + sendMessage('Auktionsmarkt', $auktion['anbieter'], 'Item versteigert!', 'Item in inverser Auktion für '.displayMoney($cost).' versteigert! '.$message_suffix); + db_query('UPDATE user SET geld = geld - '.$cost.' WHERE id = '.$winner); + } else { + sendMessage('Auktionsmarkt', $auktion['anbieter'], 'Item nicht versteigert!', 'Item in inverser Auktion wurde nicht versteigert! '.$message_suffix); + createItemForUser($item, $auktion['anbieter'], $auktion['anzahl']); + } +} + +// Handelt eine einzelne Auktion ab +// @Return nichts +function bearbeiteAbgelaufeneAuktion($auktionsid){ +// echo '
bearbeite '.$auktionsid.'
'; + + $qry = database_query('SELECT u.nickname AS anbietername, u2.nickname AS bietername, a.*, TIMESTAMPDIFF(Minute,now(),deadline) AS zeitdifferenz FROM auktion AS a INNER JOIN user as u ON a.anbieter = u.id LEFT JOIN user as u2 ON a.bieter = u2.id WHERE auktionsid = '.$auktionsid); + + if(mysqli_num_rows($qry) == 0){ return NULL; } + $result = mysqli_fetch_assoc($qry); + + if ($result['type'] == 2) { + bearbeiteAbgelaufeneInverseAuktion($result); + return; + } + + $itemreceiver = ''; + + // Nun muss geprüft werden, ob überhaupt jemand geboten hat! + if($result['bieter'] == NULL){ // Wenn nicht, dann geht das item an den anbieter + $itemreceiver = $result['anbieter']; + } + else{ + // Ansonsten geht das Item an den Bietenden + $itemreceiver = $result['bieter']; + // Aber erst muss das Geld überwiesen werden + $erhalten = ceil($result['aktuellesgebot'] * 0.99); + $gebuehr = $result['aktuellesgebot'] - $erhalten; + + database_query('UPDATE user SET geld = geld - '.$result['aktuellesgebot'].' WHERE id = '.$result['bieter']); + database_query('UPDATE user SET geld = geld + '.$erhalten.' WHERE id = '.$result['anbieter']); + + if($result[cheatingverdacht] == 0){ // Wenn cheatingverdacht nicht besteht, dann pruefe ob Verdacht besteht!! + $avgprice = getAveragePrice($result[itemid], $result[tablename], $result[anzahl]); + if($avgprice != 0 && $avgprice * 1.2 < $result['aktuellesgebot'] && $result['anbieter'] != 1){ + $result[cheatingverdacht] = 1; + } + } + + //Transaktion verbuchen + $test = 'INSERT INTO auktion_transaktionen (anbieter, bieter, itemid, tablename, anzahl, betrag, deadline,cheatingverdacht) VALUES('.$result['anbieter'].','.$result['bieter'].','.$result['itemid'].',\''.$result['tablename'].'\','.$result['anzahl'].','.$result['aktuellesgebot'].',\''.$result['deadline'].'\','.$result['cheatingverdacht'].')'; + database_query($test); + //echo '

'.$test.'

'; + } + $anzahl = $result['anzahl']; + $item_row_name = 'item'; + if($result['tablename'] == 'ware'){$item_row_name = 'item_id';} #database_query('DELETE FROM auktion WHERE auktionsid = '.$auktionsid); - while($anzahl-- > 0){ + while($anzahl-- > 0){ if($anzahl > 1000 && $anzahl % 1000 == 0) { echo date("H:i:s").' Anzahl maxi Auktion '.$anzahl."\n"; } - database_query('INSERT INTO '.$result['tablename'].' ('.$item_row_name.', user) VALUES('.$result['itemid'].','.$itemreceiver.')'); - } - + database_query('INSERT INTO '.$result['tablename'].' ('.$item_row_name.', user) VALUES('.$result['itemid'].','.$itemreceiver.')'); + } + database_query('DELETE FROM auktion WHERE auktionsid = '.$auktionsid); - - if($result['bieter'] == NULL){ - database_query('INSERT INTO nachricht(von, besitzer, betreff, text) VALUES (\'Auktionsmarkt\', '.$result['anbieter'].', \'Item nicht verkauft\', \' Tut mir leid, doch Sie sind das Item '.$result['itemname'].' mit dem Startgebot '.$result['startgebot'].' nicht losgeworden. Deadline war '.$result['deadline'].'\')'); - } else{ - // Nun noch die Gluecklichen benachrichtigen - database_query('INSERT INTO nachricht(von, besitzer, betreff, text) VALUES (\'Auktionsmarkt\', '.$result['anbieter'].', \'Item erfolgreich verkauft\', \' Herzlichen Glückwunsch, Sie sind das Item '.$result['itemname'].' für ganze '.$result['aktuellesgebot'].' an '.$result['bietername'].' losgeworden. Anzahl war '.$result['anzahl'].'. Nach abzug der Gebühr von '.$gebuehr.' (ca. 1%) bleiben noch '.$erhalten.' über. Deadline war '.$result['deadline'].'\')'); - database_query('INSERT INTO nachricht(von, besitzer, betreff, text) VALUES (\'Auktionsmarkt\', '.$result['bieter'].', \'Item erfolgreich ersteigert\', \' Herzlichen Glückwunsch, Sie haben das Item '.$result['itemname'].' für ganze '.$result['aktuellesgebot'].' von '.$result['anbietername'].' ersteigert. Anzahl war '.$result['anzahl'].', Deadline war '.$result['deadline'].'\')'); - } - - -} - -//Sucht nach abgelaufenen Auktionen und handelt diese ab -// @Return nichts -function bearbeiteAlleAbgelaufenenAuktionen(){ - $qry = database_query('SELECT auktionsid from auktion where TIMESTAMPDIFF(Minute,now(),deadline) < 0'); - // Gehe alle Auktionen durch und bearbeite diese - $index = 0; - while($result = mysqli_fetch_assoc($qry)){ - bearbeiteAbgelaufeneAuktion($result['auktionsid']); - $index++; - } - return $index; -} - -function insertAuktionen(){ - if(Date("D") == 'Sun'){ - defineIfNotDefined('GEHEIM_START_GEBOT', 1000000); - - // Definiert wieviele Auktion insgesamt minimal geplant werden - defineIfNotDefined('GEHEIM_ANZAHL_AUKTIONEN_MIN', 1); - // Definiert wieviele Auktion insgesamt maximal geplant werden - defineIfNotDefined('GEHEIM_ANZAHL_AUKTIONEN_MAX', 2); - // Definiert wieviele Items gleichzeitig pro Auktion auslaufen - defineIfNotDefined('GEHEIM_ANZAHL_AUKTIONS_ITEMS', 4); - // Definiert wie hoch die Chance ist eine Niete zu bekommen. 0.5 = 50% - defineIfNotDefined('GEHEIM_CHANCE_NIETE', 0.5); - - $anzahl_auktionen = mt_random_wrapper(GEHEIM_ANZAHL_AUKTIONEN_MIN,GEHEIM_ANZAHL_AUKTIONEN_MAX); // anzahl der auktionen die gleichzeitig starten (ein oder zwei) - $anzahl_auktions_items = GEHEIM_ANZAHL_AUKTIONS_ITEMS; - $chance_niete = GEHEIM_CHANCE_NIETE * 100; - $startgebot = GEHEIM_START_GEBOT; - - // Jeden Sonntag wird dieser Skript ausgefuehrt! - // erstmal checken obs schon Auktionen für kommende Woche gibt - $number = mysqli_num_rows(database_query('SELECT * FROM auktion WHERE anbieter = 1 and TIMESTAMPDIFF(Second,startdate,now()) < 0')); -// echo $number.'= Number of effected rows'; - if($number == 0){ - // So, also es sind noch keine Auktionen vorhanden!! - // Nun 6 Auktionen erstellen 3x2 Auktionen (update 2x2) - $date = mysqli_fetch_assoc(database_query('Select current_date AS date')); - $qry = database_query('SELECT id FROM `wochen_markt` WHERE aktiv = \'ja\''); - $fruchtcount = 0; - $frucht = array(); - while($result = mysqli_fetch_assoc($qry)){ - $frucht[$fruchtcount++] = $result[id]; - } - - // Ermittle die "Niete" (das wertloseste Item auf der Schatzsuche) - $qry = database_query('Select id from `sp_item` where wert = (Select min(wert) from `sp_item`)'); - $nieten_id = mysqli_fetch_assoc($qry); - $nieten_id = $nieten_id['id']; - - for($i = 0; $i<$anzahl_auktionen; $i++) { - // Termin festlegen - // Start Sonntag->0,Montag->1,Dienstag->2, Mittwoch->3, Donnerstag->4 - $off = mt_random_wrapper(0,4); - $start = 'TIMESTAMPADD(Day,'.$off.',\''.$date[date].' 20:00:00\')'; - $deadline = 'TIMESTAMPADD(Day,'.($off+3).',\''.$date[date].' 20:00:00\')'; - - for($t = 0; $t<$anzahl_auktions_items; $t++) { - if(mt_random_wrapper(1,100) <= $chance_niete) { - $item_table = 'sp_ware'; - $item_id = $nieten_id; - } else { - $item_table = 'wochen_ware'; - $item_id = $frucht[mt_random_wrapper(0,$fruchtcount-1)]; - } - $test = 'INSERT INTO auktion (itemid, itemname, tablename, anbieter, anzahl, deadline, startgebot, startdate) VALUES('.$item_id.',\'Geheim!\',\''.$item_table.'\',1,1,'.$deadline.','.$startgebot.','.$start.')'; - // echo $test."
\n"; - database_query($test); - } - } - } else if($number > GEHEIM_ANZAHL_AUKTIONEN_MAX * GEHEIM_ANZAHL_AUKTIONS_ITEMS){ - // echo 'Es gab zuviele Geheimauktionen ('.$number.') entferne die überschüssigen!'; - database_query('DELETE FROM auktion WHERE anbieter = 1 LIMIT '.($number-GEHEIM_ANZAHL_AUKTIONEN_MAX * GEHEIM_ANZAHL_AUKTIONS_ITEMS)); - } - } -} - -function detectMultiAccounts(){ - $sql = 'Select u1.id as uid1, u2.id as uid2, u1.nickname as n1, u2.nickname as n2 , u1.ip as ip1, u2.ip as ip2, u1.online_zeit as o1, u2.online_zeit as o2 from user as u1 inner join user as u2 on u1.ip = u2.ip and u1.id < u2.id and u1.ip != \'\' and abs(TIMESTAMPDIFF(HOUR, u1.online_zeit, u2.online_zeit)) < 24 and (abs(TIMESTAMPDIFF(HOUR, now(), u1.online_zeit)) < 1 || abs(TIMESTAMPDIFF(HOUR, now(), u2.online_zeit)) < 1)'; - $qry = db_query($sql); - while($tmp = mysqli_fetch_assoc($qry)){ - $otime = min($tmp['o2'], $tmp['o1']); - $sql = 'INSERT INTO multiuser(user1, user2, occured, type) values(\'' . $tmp['uid1'] . '\', \''.$tmp['uid2'].'\',\''.$otime.'\', \'IP_'.$tmp['ip1'].'\')'; - db_query($sql); - } -} - -// sollte irgendwann mit der auktion_funktions verlinkt werden -function getAveragePrice($itemid, $tablename, $anzahl){ - $sql = 'SELECT avg(betrag) / avg(anzahl) AS average FROM auktion_transaktionen WHERE anbieter != 1 and itemid = '.$itemid.' and tablename = \''.$tablename.'\' and cheatingverdacht = 0'; - $qry = database_query($sql); - $row = mysqli_fetch_assoc($qry); - return round($row['average']*$anzahl); -} - -$array = array(); - -if(!isset($argv)) { - // invocation by server - $arrayCpy = array(); -} else { - // invocation by cronjob - exec('pgrep '.$argv[0], $array); - - $arrayCpy = array(); - foreach($array as $tmp) { - if($tmp != getmypid()) { - $arrayCpy[] = $tmp; - } - } -} + + if($result['bieter'] == NULL){ + database_query('INSERT INTO nachricht(von, besitzer, betreff, text) VALUES (\'Auktionsmarkt\', '.$result['anbieter'].', \'Item nicht verkauft\', \' Tut mir leid, doch Sie sind das Item '.$result['itemname'].' mit dem Startgebot '.$result['startgebot'].' nicht losgeworden. Deadline war '.$result['deadline'].'\')'); + } else{ + // Nun noch die Gluecklichen benachrichtigen + database_query('INSERT INTO nachricht(von, besitzer, betreff, text) VALUES (\'Auktionsmarkt\', '.$result['anbieter'].', \'Item erfolgreich verkauft\', \' Herzlichen Glückwunsch, Sie sind das Item '.$result['itemname'].' für ganze '.$result['aktuellesgebot'].' an '.$result['bietername'].' losgeworden. Anzahl war '.$result['anzahl'].'. Nach abzug der Gebühr von '.$gebuehr.' (ca. 1%) bleiben noch '.$erhalten.' über. Deadline war '.$result['deadline'].'\')'); + database_query('INSERT INTO nachricht(von, besitzer, betreff, text) VALUES (\'Auktionsmarkt\', '.$result['bieter'].', \'Item erfolgreich ersteigert\', \' Herzlichen Glückwunsch, Sie haben das Item '.$result['itemname'].' für ganze '.$result['aktuellesgebot'].' von '.$result['anbietername'].' ersteigert. Anzahl war '.$result['anzahl'].', Deadline war '.$result['deadline'].'\')'); + } + + +} + +//Sucht nach abgelaufenen Auktionen und handelt diese ab +// @Return nichts +function bearbeiteAlleAbgelaufenenAuktionen(){ + $qry = database_query('SELECT auktionsid from auktion where TIMESTAMPDIFF(Minute,now(),deadline) < 0'); + // Gehe alle Auktionen durch und bearbeite diese + $index = 0; + while($result = mysqli_fetch_assoc($qry)){ + bearbeiteAbgelaufeneAuktion($result['auktionsid']); + $index++; + } + return $index; +} + +function insertAuktionen(){ + if(Date("D") == 'Sun'){ + defineIfNotDefined('GEHEIM_START_GEBOT', 1000000); + + // Definiert wieviele Auktion insgesamt minimal geplant werden + defineIfNotDefined('GEHEIM_ANZAHL_AUKTIONEN_MIN', 1); + // Definiert wieviele Auktion insgesamt maximal geplant werden + defineIfNotDefined('GEHEIM_ANZAHL_AUKTIONEN_MAX', 2); + // Definiert wieviele Items gleichzeitig pro Auktion auslaufen + defineIfNotDefined('GEHEIM_ANZAHL_AUKTIONS_ITEMS', 4); + // Definiert wie hoch die Chance ist eine Niete zu bekommen. 0.5 = 50% + defineIfNotDefined('GEHEIM_CHANCE_NIETE', 0.5); + + $anzahl_auktionen = mt_random_wrapper(GEHEIM_ANZAHL_AUKTIONEN_MIN,GEHEIM_ANZAHL_AUKTIONEN_MAX); // anzahl der auktionen die gleichzeitig starten (ein oder zwei) + $anzahl_auktions_items = GEHEIM_ANZAHL_AUKTIONS_ITEMS; + $chance_niete = GEHEIM_CHANCE_NIETE * 100; + $startgebot = GEHEIM_START_GEBOT; + + // Jeden Sonntag wird dieser Skript ausgefuehrt! + // erstmal checken obs schon Auktionen für kommende Woche gibt + $number = mysqli_num_rows(database_query('SELECT * FROM auktion WHERE anbieter = 1 and TIMESTAMPDIFF(Second,startdate,now()) < 0')); +// echo $number.'= Number of effected rows'; + if($number == 0){ + // So, also es sind noch keine Auktionen vorhanden!! + // Nun 6 Auktionen erstellen 3x2 Auktionen (update 2x2) + $date = mysqli_fetch_assoc(database_query('Select current_date AS date')); + $qry = database_query('SELECT id FROM `wochen_markt` WHERE aktiv = \'ja\''); + $fruchtcount = 0; + $frucht = array(); + while($result = mysqli_fetch_assoc($qry)){ + $frucht[$fruchtcount++] = $result[id]; + } + + // Ermittle die "Niete" (das wertloseste Item auf der Schatzsuche) + $qry = database_query('Select id from `sp_item` where wert = (Select min(wert) from `sp_item`)'); + $nieten_id = mysqli_fetch_assoc($qry); + $nieten_id = $nieten_id['id']; + + for($i = 0; $i<$anzahl_auktionen; $i++) { + // Termin festlegen + // Start Sonntag->0,Montag->1,Dienstag->2, Mittwoch->3, Donnerstag->4 + $off = mt_random_wrapper(0,4); + $start = 'TIMESTAMPADD(Day,'.$off.',\''.$date[date].' 20:00:00\')'; + $deadline = 'TIMESTAMPADD(Day,'.($off+3).',\''.$date[date].' 20:00:00\')'; + + for($t = 0; $t<$anzahl_auktions_items; $t++) { + if(mt_random_wrapper(1,100) <= $chance_niete) { + $item_table = 'sp_ware'; + $item_id = $nieten_id; + } else { + $item_table = 'wochen_ware'; + $item_id = $frucht[mt_random_wrapper(0,$fruchtcount-1)]; + } + $test = 'INSERT INTO auktion (itemid, type, itemname, tablename, anbieter, anzahl, deadline, startgebot, startdate) VALUES('.$item_id.',2,\'Geheim!\',\''.$item_table.'\',1,1,'.$deadline.','.$startgebot.','.$start.')'; + // echo $test."
\n"; + database_query($test); + } + } + } else if($number > GEHEIM_ANZAHL_AUKTIONEN_MAX * GEHEIM_ANZAHL_AUKTIONS_ITEMS){ + // echo 'Es gab zuviele Geheimauktionen ('.$number.') entferne die überschüssigen!'; + database_query('DELETE FROM auktion WHERE anbieter = 1 LIMIT '.($number-GEHEIM_ANZAHL_AUKTIONEN_MAX * GEHEIM_ANZAHL_AUKTIONS_ITEMS)); + } + } +} + +function detectMultiAccounts(){ + $sql = 'Select u1.id as uid1, u2.id as uid2, u1.nickname as n1, u2.nickname as n2 , u1.ip as ip1, u2.ip as ip2, u1.online_zeit as o1, u2.online_zeit as o2 from user as u1 inner join user as u2 on u1.ip = u2.ip and u1.id < u2.id and u1.ip != \'\' and abs(TIMESTAMPDIFF(HOUR, u1.online_zeit, u2.online_zeit)) < 24 and (abs(TIMESTAMPDIFF(HOUR, now(), u1.online_zeit)) < 1 || abs(TIMESTAMPDIFF(HOUR, now(), u2.online_zeit)) < 1)'; + $qry = db_query($sql); + while($tmp = mysqli_fetch_assoc($qry)){ + $otime = min($tmp['o2'], $tmp['o1']); + $sql = 'INSERT INTO multiuser(user1, user2, occured, type) values(\'' . $tmp['uid1'] . '\', \''.$tmp['uid2'].'\',\''.$otime.'\', \'IP_'.$tmp['ip1'].'\')'; + db_query($sql); + } +} + +// sollte irgendwann mit der auktion_funktions verlinkt werden +function getAveragePrice($itemid, $tablename, $anzahl){ + $sql = 'SELECT avg(betrag) / avg(anzahl) AS average FROM auktion_transaktionen WHERE anbieter != 1 and itemid = '.$itemid.' and tablename = \''.$tablename.'\' and cheatingverdacht = 0'; + $qry = database_query($sql); + $row = mysqli_fetch_assoc($qry); + return round($row['average']*$anzahl); +} + +$array = array(); + +if(!isset($argv)) { + // invocation by server + $arrayCpy = array(); +} else { + // invocation by cronjob + exec('pgrep '.$argv[0], $array); + + $arrayCpy = array(); + foreach($array as $tmp) { + if($tmp != getmypid()) { + $arrayCpy[] = $tmp; + } + } +} // check if this cronjob is already busy!! -if(count($arrayCpy)<=1) { - // Starten der Auktionsverteilung - $i = bearbeiteAlleAbgelaufenenAuktionen(); - //$sql = 'INSERT INTO nachricht(von, besitzer, betreff, text) VALUES (\'GM-INFO\', 3735, \'Cronjob lief!\', \' Der Vierteilstunde-Cronjob wurde ausgefuehrt! Es wurden '.$i.' Anfragen bearbeitet!\')'; - //database_query($sql); - insertAuktionen(); - detectMultiAccounts(); +if(count($arrayCpy)<=1) { + // Starten der Auktionsverteilung + $i = bearbeiteAlleAbgelaufenenAuktionen(); + //$sql = 'INSERT INTO nachricht(von, besitzer, betreff, text) VALUES (\'GM-INFO\', 3735, \'Cronjob lief!\', \' Der Vierteilstunde-Cronjob wurde ausgefuehrt! Es wurden '.$i.' Anfragen bearbeitet!\')'; + //database_query($sql); + insertAuktionen(); + detectMultiAccounts(); }