From dddf53ed9ea2735f52767b891c4ff2abecc73a46 Mon Sep 17 00:00:00 2001 From: Quitta Date: Mon, 12 Aug 2013 23:56:58 +0200 Subject: [PATCH] ticket hanling function added --- .../ams_lib/autoload/mail_handler.php | 108 +++++++++++++----- .../ryzom_ams/www/html/autoload/webusers.php | 24 ++-- .../server/ryzom_ams/www/html/sql/install.php | 7 ++ .../ryzom_ams/www/html/sql/ticketsql.sql | 7 ++ .../www/html/sql/ticketsystemmodel.mwb | Bin 16265 -> 16833 bytes 5 files changed, 111 insertions(+), 35 deletions(-) diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php index be4ad30b9..fd51e2b21 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/mail_handler.php @@ -33,6 +33,11 @@ class Mail_Handler{ return $user->getTUserId(); } + function get_id_from_email($email){ + $webUserId = WebUsers::getIdFromEmail($email); + $user = Ticket_User::constr_ExternId($webUserId); + return $user->getTUserId(); + } public static function send_mail($recipient, $subject, $body, $from = NULL) { @@ -91,7 +96,8 @@ class Mail_Handler{ $emails = $statement->fetchAll(); foreach($emails as $email) { - $message_id = self::new_message_id(); + $message_id = self::new_message_id($email['TicketId']); + //if recipient isn't given, then use the email of the id_user instead! echo("Emailing {$email['Recipient']}\n"); if(!$email['Recipient']) { @@ -105,7 +111,7 @@ class Mail_Handler{ } else { $from = $oms_reply_to; } - $headers = "From: $from\r\n" . "Message-ID: " . $message_id; + $headers = "From: $from\r\n" . "Message-ID: " . $message_id ; print("recip: " . $email['Recipient']); print("subj: " .$email['Subject']); print("body: " . $email['Body']); @@ -131,28 +137,15 @@ class Mail_Handler{ for ($i = 1; $i <= $message_count; ++$i) { - $header = imap_header($mbox, $i); - //print_r($header); - $entire_email = imap_fetchheader($mbox, $i) . imap_body($mbox, $i); - $subject = self::decode_utf8($header->subject); - $to = $header->to[0]->mailbox; - $from = $header->from[0]->mailbox . '@' . $header->from[0]->host; - $txt = self::get_part($mbox, $i, "TEXT/PLAIN"); - $html = self::get_part($mbox, $i, "TEXT/HTML"); - print("================"); - print("subj: ".$subject); - print("to: ".$to); - print("from: ".$from); - print("txt: " .$txt); - print("html: ".$html); - //return task ID + self::incoming_mail_handler($mbox, $i); $tid = 1; //self::ams_create_email($from, $subject, $txt, $html, $to, $from); if($tid) { - $file = fopen($MAIL_DIR."/mail/".$tid, 'w'); + //TODO: base file on Ticket + reply id + /* $file = fopen($MAIL_DIR."/mail/".$tid, 'w'); fwrite($file, $entire_email); - fclose($file); + fclose($file); */ } //mark message $i of $mbox for deletion! imap_delete($mbox, $i); @@ -167,26 +160,87 @@ class Mail_Handler{ - function new_message_id() { - + function new_message_id($ticketId) { $time = time(); $pid = getmypid(); global $cfg; global $ams_mail_count; $ams_mail_count = ($ams_mail_count == '') ? 1 : $ams_mail_count + 1; - return ""; + return ""; } - + function get_ticket_id_from_subject($subject){ + print('got it from subject!'); + $startpos = strpos($subject, "[Ticket #"); + $tempString = substr($subject, $startpos+9); + $endpos = strpos($tempString, "]"); + $ticket_id = substr($tempString, 0, $endpos); + return $ticket_id; + } - function ams_create_email($from, $subject, $body, $html, $recipient = 0, $sender = NULL) { + + function incoming_mail_handler($mbox,$i){ + + $header = imap_header($mbox, $i); + $subject = self::decode_utf8($header->subject); + + print_r($header); + + //get ticket_id out of the message-id or else out of the subject line + $ticket_id = 0; + if(isset($header->references)){ + $pieces = explode(".", $header->references); + if($pieces[0] == "subject); + $to = $header->to[0]->mailbox; + $from = $header->from[0]->mailbox . '@' . $header->from[0]->host; + $txt = self::get_part($mbox, $i, "TEXT/PLAIN"); + $html = self::get_part($mbox, $i, "TEXT/HTML"); + + //get the id out of the email address of the person sending the email. + if($from !== NULL && !is_numeric($from)) $from = self::get_id_from_email($from); + + $user = new Ticket_User(); + $user->load_With_TUserId($from); + $ticket = new Ticket(); + $ticket->load_With_TId($ticket_id); + + //if user has access to it! + if($user->isMod() or ($ticket->getAuthor() == $user->getTUserId())){ + + } + /*print("================"); + print("subj: ".$subject); + print("to: ".$to); + print("from: ".$from); + print("txt: " .$txt); + print("html: ".$html);*/ + } + + } + + /*function ams_create_email($from, $subject, $body, $html, $recipient = 0, $sender = NULL) { //TODO: - /*if($recipient == 0 && !is_string($recipient)) { + if($recipient == 0 && !is_string($recipient)) { global $user; $recipient = $user->uid; - }*/ + } if($sender !== NULL && !is_numeric($sender)) $sender = self::get_id_from_username($sender); if(!is_numeric($recipient)) $recipient = self::get_id_from_username($recipient); @@ -212,7 +266,7 @@ class Mail_Handler{ oms_task_index($message, array('subject', 'body', 'sender', 'recipient')); //--------------------------- return $message['id_task']; - } + }*/ diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php b/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php index e93137d61..014864e2a 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/autoload/webusers.php @@ -67,14 +67,22 @@ class WebUsers extends Users{ return "fail"; } } - - //returns te id for a given username - public static function getId($username){ - $dbw = new DBLayer("web"); - $statement = $dbw->execute("SELECT * FROM ams_user WHERE Login=:username", array('username' => $username)); - $row = $statement->fetch(); - return $row['UId']; - } + + //returns te id for a given username + public static function getId($username){ + $dbw = new DBLayer("web"); + $statement = $dbw->execute("SELECT * FROM ams_user WHERE Login=:username", array('username' => $username)); + $row = $statement->fetch(); + return $row['UId']; + } + + //returns te id for a given username + public static function getIdFromEmail($email){ + $dbw = new DBLayer("web"); + $statement = $dbw->execute("SELECT * FROM ams_user WHERE Email=:email", array('email' => $email)); + $row = $statement->fetch(); + return $row['UId']; + } public function getUId(){ return $this->uId; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php b/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php index 80d7f79d8..cf8a514e4 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php +++ b/code/ryzom/tools/server/ryzom_ams/www/html/sql/install.php @@ -352,9 +352,11 @@ `Sender` INT(10) UNSIGNED NOT NULL , `UserId` INT(10) UNSIGNED NOT NULL , `MessageId` VARCHAR(45) NOT NULL , + `TicketId` INT UNSIGNED NOT NULL , PRIMARY KEY (`MailId`) , INDEX `fk_email_ticket_user1` (`Sender` ASC) , INDEX `fk_email_ticket_user2` (`UserId` ASC) , + INDEX `fk_email_ticket1` (`TicketId` ASC) , CONSTRAINT `fk_email_ticket_user1` FOREIGN KEY (`Sender` ) REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) @@ -364,6 +366,11 @@ FOREIGN KEY (`UserId` ) REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket_user` (`TUserId` ) ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_email_ticket1` + FOREIGN KEY (`TicketId` ) + REFERENCES `" . $cfg['db']['lib']['name'] ."`.`ticket` (`TId` ) + ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql index 4e8369fbe..e7864e628 100644 --- a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql +++ b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsql.sql @@ -308,9 +308,11 @@ CREATE TABLE IF NOT EXISTS `mydb`.`email` ( `Sender` INT(10) UNSIGNED NOT NULL , `UserId` INT(10) UNSIGNED NOT NULL , `MessageId` VARCHAR(45) NOT NULL , + `TicketId` INT UNSIGNED NOT NULL , PRIMARY KEY (`MailId`) , INDEX `fk_email_ticket_user1` (`Sender` ASC) , INDEX `fk_email_ticket_user2` (`UserId` ASC) , + INDEX `fk_email_ticket1` (`TicketId` ASC) , CONSTRAINT `fk_email_ticket_user1` FOREIGN KEY (`Sender` ) REFERENCES `mydb`.`ticket_user` (`TUserId` ) @@ -320,6 +322,11 @@ CREATE TABLE IF NOT EXISTS `mydb`.`email` ( FOREIGN KEY (`UserId` ) REFERENCES `mydb`.`ticket_user` (`TUserId` ) ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_email_ticket1` + FOREIGN KEY (`TicketId` ) + REFERENCES `mydb`.`ticket` (`TId` ) + ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; diff --git a/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb b/code/ryzom/tools/server/ryzom_ams/www/html/sql/ticketsystemmodel.mwb index 19bb4b86a0eb7dd63c2078e0e428a87000d568c3..baf11d3359d5b56ab84791b5294de39ccc4c5434 100644 GIT binary patch literal 16833 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 literal 16265 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