[Release] Web Coupon System

10/12/2015 06:07 xsrf#1
Guten Morgen,

da ich wie versprochen die Systeme, die mir sinnvoll erscheinen, programmieren und releasen werde, habe ich hier nun das erste fertige System für euch.

Weitere Vorschläge werden gerne entgegen genommen (:

Das System ist ein Couponsystem.

Das Team erstellt Coupons die via eigenem E-Mail Script, Forum oder sonst wie verbreitet werden können.

Anschließend hat der Benutzer die Möglichkeit diesen Coupon einzulösen. Aktuell sind die Währung Item, Donate Coin und Vote Coin enthalten.

Bei Vorschlägen zu weiteren Währungen bitte einfach im Thread melden.

Bei Vorschlägen zu neuen Systeme oder Fragen zu diesen bitte ebenfalls einfach posten (:

Der Source Code zu dem ganzen Spaß findet sich im Anhang.

Das System lässt sich mit JEDER Webseite kombinieren egal ob es nun eine alte Stefan Pfeifer, die Sapphiere Flyff oder eine eigene Webseite ist.

Hier noch ein Video:

[Only registered and activated users can see links. Click Here To Register...]
Class.Coupon.php #updated 12.10.2015

10/12/2015 12:37 kevinkraus#2
Danke für den Release sehr Nett von dir!
Schönes System :)

Mit Freundlichen Grüßen,
- Kevin
10/12/2015 12:50 -Venom'#3
Schönes Ding.
Ordentlicher Code.
1a Arbeit wie immer
10/12/2015 14:21 Lumi#4
Wow! Wie hast du die Idee so schnell umgesetzt? :o Mein dickes Lob! Sehr nützlicher Script und wird vielen sehr weiterhelfen! :) Vielen Dank.
10/12/2015 14:28 xsrf#5
Hatte die ganze Nacht nette Gesellschaft von Gentros :D

#Update

Da ich von Lumi darauf hingewiesen wurde, dass es noch eine Fehler gab hier einmal ein Update der Class.Coupon.php.

Fehler behoben/Updates:

  • Teilweise nicht versenden an die ITEM_SEND_TBL
  • Es wird gespeichert wer den Coupon benutzt hat
  • Methode zur Generierung des Schlüssels/Coupons erweitert


Class.Coupon.php

PHP Code:
<?php 

class Coupon extends Validation {
    
    private    
$sql;
    
    function 
__construct($sql){
        
$this->sql $sql;
    }
    
    private function 
SetCoupon($event$i){
        return 
strtoupper(md5(time().microtime().rand(11000000000).$i.$event));
    }
    
    private function 
SetCouponCredentials($post$account){
        
$couponCredentials = array(
            
'schedule'        =>        $post['schedule'],
            
'expire'        =>        time() + intval($post['expire'])*24*60*60,
            
'value'            =>        intval($post['value']),
            
'amount'        =>        intval($post['amount']),
            
'event'            =>        $post['event'],
            
'account'        =>        $account,
        );
        return 
$couponCredentials;
    }
    
    private function 
InsertCouponIntoDatabase($coupon$key){
        
$coupon self::Escape($coupon);
        
self::Exec($this->sql'INSERT INTO [' COUPON_TABLE_DBF '].[dbo].[Coupon] ([schedule], [coupon], [expire], [account], [value], [used], [event]) VALUES (' $coupon['schedule'] . ', \'' $key '\', ' $coupon['expire'] . ', ' $coupon['account'] . ', ' $coupon['value'] . ', 0, ' $coupon['event'] . ')');
        if(
odbc_error()){echo odbc_errormsg($this->sql);}
    }
    
    
//CREATE COUPON
    
public function CreateCoupon($post){
        
//If button is not pressed
        
if(!isset($post['create'])){return false;}else{unset($post['create']);}
        
        
//Save account
        
if(!empty($post['account'])){
            
$account =  $post['account'];
        }else {
            
$account 0;
        }
        unset(
$post['account']);
        
        
//If some fields are empty
        
if(self::EmptyInput($post) === 0){echo 'Please fill in all fields'; exit;}
        
        
//Set Coupon Credentials
        
$coupon self::SetCouponCredentials($post$account);
        
        
//Generate Keys
        
$key = array();
        for(
$k 1;$k <= $coupon['amount'];$k++){
            
$key[$k] = self::SetCoupon($post['event'], $k);
        }
        
        
//Insert Coupon into database
        
for($i 1;$i <= $coupon['amount'];$i++){
            
self::InsertCouponIntoDatabase($coupon$key[$i]);
        }
    }
    
    
//SELECT ALL COUPONS
    
private function GetAllCoupons(){
        
$coupons self::Exec($this->sql'SELECT * FROM ' COUPON_TABLE_DBF '.dbo.Coupon');
        return 
$coupons;
    }
    
    public function 
SelectAllCoupons(){
        
$coupons = array();
        
$coupons['Rows'] = self::Rows(self::GetAllCoupons());
        
$coupons['Result'] = self::Fetch(self::GetAllCoupons(), $coupons['Rows']);
        return 
$coupons;
    }
    
    
//DELETE ALL EXPIRED COUPONS
    
public function DeleteAllExpiredCoupons($post){
        if(!isset(
$post['deleteall'])){return false;}
        
self::Exec($this->sql'DELETE FROM ' COUPON_TABLE_DBF '.dbo.Coupon WHERE expire < ' time());
    }
    
    
//SELECT EVENT COUPONS
    
    
private function GetCouponsBySpecificEvent($post){
        
$post self::Escape($post);
        
$coupons self::Exec($this->sql'SELECT * FROM ' COUPON_TABLE_DBF '.dbo.Coupon WHERE [event] = ' $post['event']);
        return 
$coupons;
    }
    
    public function 
SelectEventCoupons($post){
        if(!isset(
$post['eventcoupons'])){return false;}
        
        if(
self::EmptyInput($post) === 0){echo 'Please fill in all fields'; exit;}
        
        
$coupons = array();
        
$coupons['Rows'] = self::Rows(self::GetCouponsBySpecificEvent($post));
        if(
$coupons['Rows'] > 0){
            
$coupons['Result'] = self::Fetch(self::GetCouponsBySpecificEvent($post), $coupons['Rows']);
        }else {
            echo 
'No coupons found.'; exit;
        }
        return 
$coupons;
    }
    
    
//USE COUPONS
    
    
private function GetUsersSpecificCoupon($post$account){
        
$post self::Escape($post);
        
$coupon self::Exec($this->sql'SELECT * FROM ' COUPON_TABLE_DBF '.dbo.Coupon WHERE [coupon] = ' $post['coupon']);
        return 
$coupon;
    }
    
    private function 
GetSpecificReward($schedule$value$player$account$coupon){
                
self::Exec($this->sql'UPDATE [' COUPON_TABLE_DBF '].[dbo].[Coupon] SET [used] = 1 WHERE [coupon] = \'' $coupon '\'');
                
self::Exec($this->sql'UPDATE [' COUPON_TABLE_DBF '].[dbo].[Coupon] SET [account] = \'' $account '\' WHERE [coupon] = \'' $coupon '\'');
        switch(
$schedule){
            case 
'item'
                
self::Exec($this->sql'INSERT INTO [CHARACTER_01_DBF].[dbo].[ITEM_SEND_TBL] ([m_idPlayer], [serverindex], [Item_Name], [Item_count], [idSender]) VALUES (\'' $player '\', \'01\', \'' $value '\', 1, \'0000000\')');
                break;
            case 
'dcoins':
                
$old self::Fetch(self::Exec($this->sql'SELECT [' DONATE_COIN_ROW '] FROM [' WEBSITE_DATABASE '].[dbo].[' DONATE_COIN_TABLE '] WHERE [username] = \'' $account '\''), 1);
                
$old intval($old[1][DONATE_COIN_ROW]);
                
$new intval($value) + intval($old);
                
self::Exec($this->sql'UPDATE [' WEBSITE_DATABASE '].[dbo].[' DONATE_COIN_TABLE '] SET [' DONATE_COIN_ROW '] = ' $new ' WHERE [username] = \'' $account '\'');
                break;
            case 
'vcoins':
                
$old self::Fetch(self::Exec($this->sql'SELECT [' VOTE_COIN_ROW '] FROM [' WEBSITE_DATABASE '].[dbo].[' VOTE_COIN_TABLE '] WHERE [username] = \'' $account '\''), 1);
                
$old intval($old[1][VOTE_COIN_ROW]);
                
$new intval($value) + intval($old);
                
self::Exec($this->sql'UPDATE [' WEBSITE_DATABASE '].[dbo].[' VOTE_COIN_TABLE '] SET [' VOTE_COIN_ROW '] = ' $new ' WHERE [username] = \'' $account '\'');
                break;
        }
    }
    
    public function 
GetCharacterByAccount(){
        
$account $_SESSION[SESSION_USER];
        
$chars self::Exec($this->sql'SELECT [m_idPlayer], [m_szName] FROM [CHARACTER_01_DBF].[dbo].[CHARACTER_TBL] WHERE [account] = \'' $account'\' AND [isblock] = \'F\'');
        
$rows self::Rows($chars);
        if(
$rows <= 0){die('You have to create a character before you can use a coupon.');}
        
$result self::Fetch($chars$rows);
        return 
$result;
    }
    
    public function 
UseCoupon($post){
        
$account $_SESSION[SESSION_USER];
        if(!isset(
$post['usecoupon'])){return false;}
        
        if(
self::EmptyInput($post) === 0){echo 'Please fill in all fields'; exit;}
        
$coupon self::GetUsersSpecificCoupon($post$account);
        
$arr = array();
        
$arr['Rows'] = self::Rows($coupon);
        if(
$arr['Rows'] > 0){
            
$arr['Result'] = self::Fetch($coupon$arr['Rows']);
            if(
intval($arr['Result'][1]['expire']) >= time()){
                if(
intval($arr['Result'][1]['used']) === 0){
                    if(
$arr['Result'][1]['account'] === '0'){
                        
$characterSave $post['character'];
                        
$post self::Escape($post);
                        
$charlength strlen($characterSave);
                        
$str null;
                        for(
$i 1;$i <= 7-intval($charlength);$i++){
                            
$str .= '0';
                        }
                        
$str .= $characterSave;
                        echo 
$str;
                        
self::GetSpecificReward($arr['Result'][1]['schedule'], $arr['Result'][1]['value'], $str$account$arr['Result'][1]['coupon']);
                        echo 
'Item has been send to your character.'; exit;
                    }else {
                        if(
$arr['Result'][1]['account'] === $account){
                            
self::GetSpecificReward($arr['Result'][1]['schedule'], $arr['Result'][1]['value'], $post['character'], $account$arr['Result'][1]['coupon']);
                            echo 
'Item has been send to your character.'; exit;
                        }else {
                            echo 
'This coupon is reserved for another player.'; exit;
                        }
                    }
                }else {
                    echo 
'Coupon was already used by another player.'; exit;
                }
            }else {
                echo 
'Coupon has been expired.'; exit;
            }
        }else {
            echo 
'Coupon not found.'; exit;
        }
    }
    
}

class 
Validation {
    
    public static function 
EmptyInput($array){
        
$result 1;
        foreach(
$array as $key => $value){
            if(empty(
$array[$key])){
                return 
$result 0;
            }
        }
        return 
$result;
    }
    
    protected function 
Escape($array){
        foreach(
$array as $key => $value){
            if(
gettype($value) != 'integer' && $value !== null){
                
$array[$key] = '0x'.bin2hex($value);
            }else {
                
$array[$key] = $value;
            }
        }
        return 
$array;
    }
    
    protected function 
Exec($sql$qry){
         
$exec = @odbc_exec($sql$qry);
         if(
odbc_error()){echo odbc_errormsg($sql);}
         return 
$exec;
    }
    
    protected function 
Rows($rlt){
        return @
odbc_num_rows($rlt);
    }
    
    protected function 
Fetch($rlt$rows){
        
$arr = array();
        for(
$i 1;$i <= $rows;$i++){
           
$arr[$i] = @odbc_fetch_array($rlt$i); 
        }
        return 
$arr;
    }
    
}
10/13/2015 21:54 Chyukαsame#6
Guter Release ^^
Deine Item Liste (wahrscheinlich dynamisch gelistet) releast du doch bestimmt auch :D
10/13/2015 22:45 xsrf#7
Welche Itemliste? :o
10/14/2015 11:32 -Venom'#8
Quote:
Originally Posted by Chyukαsame View Post
Guter Release ^^
Deine Item Liste (wahrscheinlich dynamisch gelistet) releast du doch bestimmt auch :D
Die item Liste ist relativ einfach zu machen.
Wie es mit Ajax aussieht weiß ich nicht.
Aber du musst um so eine Liste zu erhalten item_dbf aktivieren danach kannste den PHP Code schreiben.
10/14/2015 21:01 Lumi#9
Quote:
Originally Posted by AMAZEN View Post
Welche Itemliste? :o
Ich vermute mal deine eigene Wiki. :D Sieht jedenfalls sehr schick aus.
10/15/2015 10:34 Chyukαsame#10
Quote:
Originally Posted by Gentros' View Post
Die item Liste ist relativ einfach zu machen.
Wie es mit Ajax aussieht weiß ich nicht.
Aber du musst um so eine Liste zu erhalten item_dbf aktivieren danach kannste den PHP Code schreiben.

Wie ich eine solche Liste mache ist mir bewusst Gentros, ich bin nicht gerade kurz in der Web Entwicklung. Ajax hält die Liste permanent aktuell und verbessert die Ladezeit da die Liste ja nicht gerade klein ist.

Aber wenn es für dich so einfach ist, warum hat AMAZEN es für dich gecodet und nicht du selber?
10/15/2015 16:09 xTwiLightx#11
Was hat denn ein asynchroner XML Call mit der Aktualität einer Liste zu tun?
Wollt ihr alle paar Sekunden ALLE Items aus der Datenbank laden lassen, nur damit die Liste auf der Homepage aktuell ist?
10/17/2015 01:21 Futaba1#12
Schönes System werde es nutzen
10/17/2015 01:44 Michi#13
Naja man hätte auch das Promocode System von xBlubbs erweitern können, welches man übrigens im Release von Chyukasame findet(Forsaken Flyff Release).
10/17/2015 10:05 Chyukαsame#14
Amazen hat es schon recht gut gemacht ^^
10/17/2015 10:39 Lumi#15
Quote:
Originally Posted by 'Dude' View Post
Naja man hätte auch das Promocode System von xBlubbs erweitern können, welches man übrigens im Release von Chyukasame findet(Forsaken Flyff Release).
Hätte hätte Fahrradkette.

Ich persönlich würde es auch selber schreiben, wenn ich die Kenntnisse dafür habe. Wozu dann also ein bestehendes nehmen und umschreiben? :P
Amazen hat es wirklich schon gut gemacht. ^^