<?php

require_once 'newedge/classes/NE_Error.php';
require_once 'newedge/classes/NE_MailGateway.php';
require_once 'plugins/server/teamspeak3/class.teamspeak3server.php';
require_once 'modules/clients/models/domain.php';
require_once 'modules/admin/models/ServerPlugin.php';
/**
* @package Plugins
*/
class PluginTeamspeak3 extends ServerPlugin
{
        
    /*****************************************************************/
    // function getVariables - required function
    /*****************************************************************/
    function getVariables(){
        /* Specification
              itemkey     - used to identify variable in your other functions
              type        - text,textarea,yesno,password
              description - description of the variable, displayed in ClientExec
              encryptable - used to indicate the variable's value must be encrypted in the database
        */
    
    
        $variables = array (
                   /*T*/"Name"/*/T*/ => array (
                                        "type"          => "hidden",
                                        "description"   => "Used By CE to show plugin - must match how you call the action function names",
                                        "value"         => "Teamspeak 3"
                                       ),
                   /*T*/"Description"/*/T*/ => array (
                                        "type"          => "hidden",
                                        "description"   => /*T*/"Description viewable by admin in server settings"/*/T*/,
                                        "value"         => /*T*/"Teamspeak 3 voice server integration.  Note: The custom field settings are used to hold information about the clients server.  Please create these fields in admin->custom fields->packages first.  The package name on server fields for each package hold the slot count.  Suspending a server sets the slot count to 0."/*/T*/
                                       ),
                   /*T*/"Username"/*/T*/ => array (
                                        "type"          => "text",
                                        "description"   => /*T*/"Username used to connect to server"/*/T*/,
                                        "value"         => ""
                                       ),
                   /*T*/"Password"/*/T*/ => array (
                                        "type"          => "password",
                                        "description"   => /*T*/"Password used to connect to server"/*/T*/,
                                        "value"         => "",
                                        "encryptable"   => true
                                       ),
                   /*T*/"Starting Teamspeak Port Number"/*/T*/ => array(
                                        "type"          => "text",
                                        "description"   => /*T*/"Enter the starting teamspeak port number you'd like to use.  If the port is already in use it will use the next available port."/*/T*/,
                                        "value"         => "8767"
                                        ),
                   /*T*/"Client Port Custom Field"/*/T*/ => array(
                                        "type"          => "text",
                                        "description"   => /*T*/"Enter the name of the package custom field that will hold the client teamspeak port number."/*/T*/,
                                        "value"         => ""
                                        ),
                   /*T*/"Admin Token Custom Field"/*/T*/ => array(
                                        "type"          => "text",
                                        "description"   => /*T*/"Enter the name of the package custom field that will hold the client teamspeak admin token."/*/T*/,
                                        "value"         => ""
                                        ),
                   /*T*/"Default Server Name"/*/T*/ => array(
                                        "type"          => "text",
                                        "description"   => /*T*/"Enter the default name that the server should be created with."/*/T*/,
                                        "value"         => "Teamspeak 3 Server"
                                        ),
                   /*T*/"Actions"/*/T*/ => array (
                                        "type"          => "hidden",
                                        "description"   => /*T*/"Current actions that are active for this plugin per server"/*/T*/,
                                        "value"         => "Create,Delete,Update,Suspend,Unsuspend"
                                       )
        );
        return $variables;
    }
    
    function createUserName($args)
    {
        return $args['DomainUsername'];
    }
    
    function create($args)
    {
        if (    $args['plugin_teamspeak3_Create'] != 1                           || 
                $args['PackageNameOnServer'] == null                            ||
                $args['plugin_teamspeak3_Client_Port_Custom_Field'] == ""        ||
                $args['plugin_teamspeak3_Admin_Token_Custom_Field'] == ""
           ) return;
    	$user = $args['plugin_teamspeak3_Username'];
    	$pass = $args['plugin_teamspeak3_Password'];
    	$slotcount = $args['PackageNameOnServer'];
    	$servername = $args['plugin_teamspeak3_Default_Server_Name'];
    	if ($servername == '') $servername = 'Teamspeak 3 Server';
    	
    	$package = new Domain($args['PackageID'], $this->user);
    	$package->PopulateCustomFields();
    
    	$port = "";
    	$clientpass = "";
    	$package->getCustomFieldsValue($args['plugin_teamspeak3_Client_Port_Custom_Field'], $port);

    	
    
    
    
    	$tsServer = new Teamspeak3Server(
                                       $args['ServerHostName'],
                                       $args['plugin_teamspeak3_Username'],
                                       $args['plugin_teamspeak3_Password']
    	                               );
    	$return = $tsServer->connect();
        if (is_a($return, 'NE_Error')) {
            $tsServer->disconect();
            return $return;
        }
    
        /* If a port is already defined then ensure it's available,
           otherwise find the next available port. */
    	if ($port != "") {
        	if (!$tsServer->checkPortAvailability($port)) {
        	    $tsServer->disconect();
        	    return new NE_Error('Port '. $port.' is not available.', 90);
        	}
    	} else {
    	    $portList = $tsServer->getPortList();
    	    $currentPort = $args['plugin_teamspeak3_Starting_Teamspeak_Port_Number'];
    	    while (true) {
    	        if (!in_array($currentPort, $portList)) {
    	            $port = $currentPort;
    	            break;
    	        }
    	        $currentPort++;
    	    }
    	    $package->UpdateCustomTag($args['plugin_teamspeak3_Client_Port_Custom_Field'], $port);
    	}
        $return = $tsServer->add(
                        $port,
                        $servername,
                        $args['PackageNameOnServer']
                      );
        
        $tsServer->disconect();
        
        if (is_a($return, 'NE_Error')) return $return;
                      
	    // store the admin token generated
	    $package->UpdateCustomTag($args['plugin_teamspeak3_Admin_Token_Custom_Field'], $return[1]);
	    return new NE_Error('Teamspeak 3 server created successfully.', 90);
    }
    
    function delete($args)
    {
        if (    $args['plugin_teamspeak3_Delete'] != 1                           || 
                $args['PackageNameOnServer'] == null                            ||
                $args['plugin_teamspeak3_Client_Port_Custom_Field'] == ""        ||
                $args['plugin_teamspeak3_Admin_Token_Custom_Field'] == ""
           ) return;
    
    	$package = new Domain($args['PackageID'], $this->user);
    	$package->PopulateCustomFields();
    
    	$port = "";
    	$package->getCustomFieldsValue($args['plugin_teamspeak3_Client_Port_Custom_Field'], $port);
    	if ($port == "") return;
    
        $tsServer = new Teamspeak3Server(
                                       $args['ServerHostName'],
                                       $args['plugin_teamspeak3_Username'],
                                       $args['plugin_teamspeak3_Password']
    	                               );
        $return = $tsServer->connect();
        if (is_a($return, 'NE_Error')) {
            $tsServer->disconect();
            return $return;
        }
    
        $return = $tsServer->delete($port);
        $tsServer->disconect();
        return $return;
    }
    
    function update($args)
    {
        if (    $args['plugin_teamspeak3_Update'] != 1                           || 
                $args['PackageNameOnServer'] == null                            ||
                $args['plugin_teamspeak3_Client_Port_Custom_Field'] == ""        ||
                $args['plugin_teamspeak3_Admin_Token_Custom_Field'] == ""
           ) return;
           
    	$slotcount = $args['PackageNameOnServer'];
    	$package = new Domain($args['PackageID'], $this->user);
    	$package->PopulateCustomFields();
    
    	$port = "";
    	$package->getCustomFieldsValue($args['plugin_teamspeak3_Client_Port_Custom_Field'], $port);
    	if ($port == "") return;
    
    	if (isset($args['CHANGE_PACKAGE'])) {
        	$tsServer = new Teamspeak3Server(
                                           $args['ServerHostName'],
                                           $args['plugin_teamspeak3_Username'],
                                           $args['plugin_teamspeak3_Password']
        	                               );
            $return = $tsServer->connect();
            if (is_a($return, 'NE_Error')) {
                $tsServer->disconect();
                return $return;
            }
            $return = $tsServer->update($port, $args['PackageNameOnServer']);
            $tsServer->disconect();
            return $return;
       }
    }
    
    function suspend($args) {
        if (    $args['plugin_teamspeak3_Suspend'] != 1                          || 
                $args['PackageNameOnServer'] == null                            ||
                $args['plugin_teamspeak3_Client_Port_Custom_Field'] == ""        ||
                $args['plugin_teamspeak3_Admin_Token_Custom_Field'] == ""
           ) return;
           
    	$package = new Domain($args['PackageID'], $this->user);
    	$package->PopulateCustomFields();
    
    	$port = "";
    	$package->getCustomFieldsValue($args['plugin_teamspeak3_Client_Port_Custom_Field'], $port);
    	if ($port == "") return;
    	$tsServer = new Teamspeak3Server(
                                       $args['ServerHostName'],
                                       $args['plugin_teamspeak3_Username'],
                                       $args['plugin_teamspeak3_Password']
    	                               );
        $return = $tsServer->connect();
        if (is_a($return, 'NE_Error')) {
            $tsServer->disconect();
            return $return;
        }
        $return = $tsServer->suspend($port);
        $tsServer->disconect();
        return $return;
    }
    
    function unsuspend($args) {
        if (    $args['plugin_teamspeak3_Unsuspend'] != 1                        || 
                $args['PackageNameOnServer'] == null                            ||
                $args['plugin_teamspeak3_Client_Port_Custom_Field'] == ""        ||
                $args['plugin_teamspeak3_Admin_Token_Custom_Field'] == ""
           ) return;
           
    	$package = new Domain($args['PackageID'], $this->user);
    	$package->PopulateCustomFields();
    
    	$port = "";
    	$package->getCustomFieldsValue($args['plugin_teamspeak3_Client_Port_Custom_Field'], $port);
    	if ($port == "") return;
    	$tsServer = new Teamspeak3Server(
                                       $args['ServerHostName'],
                                       $args['plugin_teamspeak3_Username'],
                                       $args['plugin_teamspeak3_Password']
    	                               );
        $return = $tsServer->connect();
        if (is_a($return, 'NE_Error')) {
            $tsServer->disconect();
            return $return;
        }
        $return = $tsServer->unsuspend($port);
        $tsServer->disconect();
        return $return;
    }
}
?>
