You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
9.9 KiB
214 lines
9.9 KiB
<?php
|
|
/*
|
|
*
|
|
* @copyright (c) 2010 animegame.eu
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public Licence
|
|
*
|
|
*/
|
|
// Laden der db-Verbindung
|
|
ignore_user_abort(true);
|
|
|
|
include "db.php";
|
|
include_once("path.inc.php");
|
|
include_once (ROOT_PATH.'/include/sqlwrapper.inc.php');
|
|
include_once(ROOT_PATH. "/include/defines.inc.php");
|
|
include_once(ROOT_PATH. "/include/random.inc.php");
|
|
|
|
// Da es wichtig ist, dass die Querys korrekt abgehandelt werden wurde folgender Code eingefuehrt
|
|
|
|
function database_query($sql){
|
|
$tmp = db_query($sql);
|
|
if(!$tmp){
|
|
echo 'SQL-Anweisung '.$sql.' konnte nicht ausgefuehrt werden!!<br>';
|
|
}
|
|
return $tmp;
|
|
}
|
|
|
|
|
|
// Handelt eine einzelne Auktion ab
|
|
// @Return nichts
|
|
function bearbeiteAbgelaufeneAuktion($auktionsid){
|
|
// echo '<br>bearbeite '.$auktionsid.'</br>';
|
|
|
|
$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 '<br><br>'.$test.'<br><br>';
|
|
}
|
|
$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){
|
|
|
|
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('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."<br>\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();
|
|
}
|
|
|