1
0
mirror of https://github.com/nerzhul/ocsms.git synced 2025-06-08 00:16:24 +00:00

Merge pull request #26 from stagprom/formatPhoneNumber

(re)formatting phone numbers
This commit is contained in:
Ner'zhul 2014-11-27 14:54:31 +01:00
commit 2211252004
4 changed files with 165 additions and 129 deletions

View File

@ -0,0 +1,66 @@
<?php
/**
* ownCloud - ocsms
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Loic Blot <loic.blot@unix-experience.fr>
* @copyright Loic Blot 2014
*/
namespace OCA\OcSms\AppInfo;
class FormatPhoneNumber {
public static function formatPhoneNumber($pn) {
$ipnrxp = array( // match international numbers with 1,2,3 digits
'#^(00|\+)(1\d\d\d)#', // NANP
'#^(00|\+)(2[1|2|3|4|5|6|8|9]\d)#', // +2(1|2|3|4|5|6|8|9)x
'#^(00|\+)(2[0|7])#', // +2x
'#^(00|\+)(3[5|7|8]\d)#', // +3(5|7|8)x
'#^(00|\+)(3[0|1|2|3|4|6|9])#', // +3x
'#^(00|\+)(4[2]\d)#', // +4(2)x
'#^(00|\+)(4[0|1|3|4|5|6|7|8|9])#', // +4x
'#^(00|\+)(5[0|9]\d)#', // +5(0|9)x
'#^(00|\+)(5[1|2|3|4|5|6|7|8])#', // +5x
'#^(00|\+)(6[7|8|9]\d)#', // +6(7|8|9)x
'#^(00|\+)(6[0|1|2|3|4|5|6])#', // +6x
'#^(00|\+)(7)#', // +7
'#^(00|\+)(8[5|7|8|9]\d)#', // +8(5|7|8|9)x
'#^(00|\+)(8[1|2|3|4|6])#', // +8x
'#^(00|\+)(9[6|7|9]\d)#', // +9(6|7|9)x
'#^(00|\+)(9[0|1|2|3|4|5|8])#' // +9x
);
$ignrxp = array( // match non digits and +
'#[^\d\+\(\)\[\]\{\}]#', // everything but digit, +, (), [] or {}
'#(.+)([\(\[\{]\d*[\)\]\}])#', // braces inside the number: +49 (0) 123 456789
'#[^\d\+]#' // everything but digits and +
);
$ignrpl = array( // replacements
'',
'$1',
''
);
/*
ToDo : make local settings in web-page
*/
$lpnrxp = array( // match local numbers
'#(^0)([^0])#' // in germany : 0-xx[x[x]]-123456
); //
$lpnrpl = '+49$2'; // replace with +49 -xx[x[x]]-123456
$tpn = trim($pn);
if( preg_match('#^[\d\+\(\[\{].*#',$tpn)) { // start with digit, +, (, [ or {
$fpn = preg_replace($ignrxp, $ignrpl, $tpn); // replace everything but digits/+ with ''
$xpn = preg_replace($lpnrxp, $lpnrpl, $fpn); // replace local prenumbers
$ypn = preg_replace($ipnrxp, '+$2', $xpn); // format to international coding +x[x[x]].....
} else {
$ypn = $tpn; // some SMS_adresses are strings
}
return $ypn;
}
}

View File

@ -9,6 +9,7 @@
* @copyright Loic Blot 2014 * @copyright Loic Blot 2014
*/ */
namespace OCA\OcSms\AppInfo; namespace OCA\OcSms\AppInfo;
@ -19,16 +20,20 @@ use \OCA\OcSms\Controller\SmsController;
use \OCA\OcSms\Db\Sms; use \OCA\OcSms\Db\Sms;
use \OCA\OcSms\Db\SmsMapper; use \OCA\OcSms\Db\SmsMapper;
use \OCA\OcSms\AppInfo\FormatPhoneNumber;
class OcSmsApp extends App { class OcSmsApp extends App {
/** /**
* @var array used to cache the parsed contacts for every request * @var array used to cache the parsed contacts for every request
*/ */
private static $contacts; /*
caching dosn´t work because on every call all will be reinstantiated
private static $contactsInverted; */
private static $contacts; // dosn´t work
private static $contactsInverted; // dosn´t work
private $c; private $c;
public function __construct (array $urlParams=array()) { public function __construct (array $urlParams=array()) {
@ -37,7 +42,7 @@ class OcSmsApp extends App {
$container = $this->getContainer(); $container = $this->getContainer();
$this->c = $container; $this->c = $container;
$app = $this; $app = $this;
/** /**
* Controllers * Controllers
*/ */
@ -80,22 +85,22 @@ class OcSmsApp extends App {
public function getContacts() { public function getContacts() {
// Only load contacts if they aren't in the buffer // Only load contacts if they aren't in the buffer
// dosn´t work
if(count(self::$contacts) == 0) { if(count(self::$contacts) == 0) {
$this->loadContacts(); $this->loadContacts();
} }
return self::$contacts; return self::$contacts;
} }
public function getInvertedContacts() { public function getInvertedContacts() {
// Only load contacts if they aren't in the buffer // Only load contacts if they aren't in the buffer
// dosn´t work
if(count(self::$contactsInverted) == 0) { if(count(self::$contactsInverted) == 0) {
$this->loadContacts(); $this->loadContacts();
} }
return self::$contactsInverted; return self::$contactsInverted;
} }
/** /**
* Partially importe this function from owncloud Chat app * Partially importe this function from owncloud Chat app
* https://github.com/owncloud/chat/blob/master/app/chat.php * https://github.com/owncloud/chat/blob/master/app/chat.php
@ -103,12 +108,12 @@ class OcSmsApp extends App {
private function loadContacts() { private function loadContacts() {
self::$contacts = array(); self::$contacts = array();
self::$contactsInverted = array(); self::$contactsInverted = array();
$cm = $this->c['ContactsManager']; $cm = $this->c['ContactsManager'];
if ($cm == null) { if ($cm == null) {
return; return;
} }
$result = array(); $result = array();
try { try {
$result = $cm->search('',array('FN')); $result = $cm->search('',array('FN'));
@ -133,74 +138,17 @@ class OcSmsApp extends App {
} }
} }
/*
all numbers will be formatted
*/
private function pushPhoneNumberToCache($rawPhone, $contactName) { private function pushPhoneNumberToCache($rawPhone, $contactName) {
// We try to add many combinaisons
$phoneNb = preg_replace("#[ ]#", "/", $rawPhone);
/* $phoneNb = FormatPhoneNumber::formatPhoneNumber($rawPhone);
* At this point, spaces are slashes.
*/
// Spaces removed
$phoneNbNoSpaces = preg_replace("#[/]#", "", $phoneNb);
// Parenthesis removed
$phoneNbNoParenthesis = preg_replace("#[(]|[)]#", "", $phoneNb);
// Dashes removed
$phoneNbNoDashes = preg_replace("#[-]#", "", $phoneNb);
// Spaces and parenthesis
$phoneNbNoSpacesParenthesis = preg_replace("#[/]|[(]|[)]#", "", $phoneNb);
// Spaces and dashes
$phoneNbNoSpacesDashes = preg_replace("#[/]|[-]#", "", $phoneNb);
// parenthesis and dashes
$phoneNbNoDashesParenthesis = preg_replace("#[-]|[(]|[)]#", "", $phoneNb);
// Nothing
$phoneNbNothing = preg_replace("#[/]|[(]|[)]|[-]#", "", $phoneNb);
// Contacts
self::$contacts[$phoneNb] = $contactName; self::$contacts[$phoneNb] = $contactName;
self::$contacts[$phoneNbNoSpaces] = $contactName;
self::$contacts[$phoneNbNoParenthesis] = $contactName;
self::$contacts[$phoneNbNoDashes] = $contactName;
self::$contacts[$phoneNbNoSpacesParenthesis] = $contactName;
self::$contacts[$phoneNbNoSpacesDashes] = $contactName;
self::$contacts[$phoneNbNoDashesParenthesis] = $contactName;
self::$contacts[$phoneNbNothing] = $contactName;
// Inverted contacts // Inverted contacts
if (!isset(self::$contactsInverted[$contactName])) { if (!isset(self::$contactsInverted[$contactName])) {
self::$contactsInverted[$contactName] = array(); self::$contactsInverted[$contactName] = array();
} }
array_push(self::$contactsInverted[$contactName], $phoneNb); array_push(self::$contactsInverted[$contactName], $phoneNb);
if (!in_array($phoneNbNoSpaces, self::$contactsInverted[$contactName])) {
array_push(self::$contactsInverted[$contactName], $phoneNbNoSpaces);
}
if (!in_array($phoneNbNoParenthesis, self::$contactsInverted[$contactName])) {
array_push(self::$contactsInverted[$contactName], $phoneNbNoParenthesis);
}
if (!in_array($phoneNbNoDashes, self::$contactsInverted[$contactName])) {
array_push(self::$contactsInverted[$contactName], $phoneNbNoDashes);
}
if (!in_array($phoneNbNoSpacesParenthesis, self::$contactsInverted[$contactName])) {
array_push(self::$contactsInverted[$contactName], $phoneNbNoSpacesParenthesis);
}
if (!in_array($phoneNbNoSpacesDashes, self::$contactsInverted[$contactName])) {
array_push(self::$contactsInverted[$contactName], $phoneNbNoSpacesDashes);
}
if (!in_array($phoneNbNoDashesParenthesis, self::$contactsInverted[$contactName])) {
array_push(self::$contactsInverted[$contactName], $phoneNbNoDashesParenthesis);
}
if (!in_array($phoneNbNothing, self::$contactsInverted[$contactName])) {
array_push(self::$contactsInverted[$contactName], $phoneNbNothing);
}
} }
} }

View File

@ -18,6 +18,7 @@ use \OCP\AppFramework\Controller;
use \OCP\AppFramework\Http\JSONResponse; use \OCP\AppFramework\Http\JSONResponse;
use \OCA\OcSms\AppInfo\OcSmsApp; use \OCA\OcSms\AppInfo\OcSmsApp;
use \OCA\OcSms\Db\SmsMapper; use \OCA\OcSms\Db\SmsMapper;
use \OCA\OcSms\AppInfo\FormatPhoneNumber;
class SmsController extends Controller { class SmsController extends Controller {
@ -99,16 +100,18 @@ class SmsController extends Controller {
$countPhone = count($phoneList); $countPhone = count($phoneList);
foreach ($phoneList as $number => $ts) { foreach ($phoneList as $number => $ts) {
$fmtPN = preg_replace("#[ ]#","/", $number); $fmtPN = FormatPhoneNumber::formatPhoneNumber($number);
if (isset($contactsSrc[$fmtPN])) { if (isset($contactsSrc[$number])) {
$fmtPN2 = preg_replace("#\/#","", $fmtPN); $contacts[$number] = $contactsSrc[$number];
$contacts[$fmtPN] = $contactsSrc[$fmtPN]; } elseif (isset($contactsSrc[$fmtPN])) {
$contacts[$fmtPN2] = $contactsSrc[$fmtPN]; $contacts[$number] = $contactsSrc[$fmtPN];
} elseif (isset($contacts[$fmtPN])) {
$contacts[$number] = $fmtPN;
} else {
$contacts[$number] = $fmtPN;
} }
} }
$lastRead = $this->smsMapper->getLastReadDate($this->userId); $lastRead = $this->smsMapper->getLastReadDate($this->userId);
return new JSONResponse(array("phonelist" => $phoneList, "contacts" => $contacts, "lastRead" => $lastRead)); return new JSONResponse(array("phonelist" => $phoneList, "contacts" => $contacts, "lastRead" => $lastRead));
} }
@ -120,9 +123,7 @@ class SmsController extends Controller {
$contacts = $this->app->getContacts(); $contacts = $this->app->getContacts();
$iContacts = $this->app->getInvertedContacts(); $iContacts = $this->app->getInvertedContacts();
$contactName = ""; $contactName = "";
$fmtPN = FormatPhoneNumber::formatPhoneNumber($phoneNumber);
// Add slashes to index properly
$fmtPN = preg_replace("#[ ]#","/", $phoneNumber);
if (isset($contacts[$fmtPN])) { if (isset($contacts[$fmtPN])) {
$contactName = $contacts[$fmtPN]; $contactName = $contacts[$fmtPN];
} }
@ -130,48 +131,29 @@ class SmsController extends Controller {
$messages = array(); $messages = array();
$phoneNumbers = array(); $phoneNumbers = array();
$msgCount = 0; $msgCount = 0;
// This table will be used to avoid duplicates
$cleanedPhones = array();
// Contact resolved // Contact resolved
if ($contactName != "" && isset($iContacts[$contactName])) { if ($contactName != "" && isset($iContacts[$contactName])) {
$ctPn = count($iContacts[$contactName]); // forall numbers in iContacts
foreach($iContacts[$contactName] as $cnumber) {
// We merge each message list into global messagelist $messages = $messages + $this->smsMapper->getAllMessagesForPhoneNumber($this->userId, $cnumber, $lastDate);
for ($i=0; $i < $ctPn; $i++) { $msgCount += $this->smsMapper->countMessagesForPhoneNumber($this->userId, $cnumber);
// Remove slashes $phoneNumbers[] = FormatPhoneNumber::formatPhoneNumber($cnumber);
$fmtPN = preg_replace("#[/]#"," ", $iContacts[$contactName][$i]);
$messages = $messages +
$this->smsMapper->getAllMessagesForPhoneNumber($this->userId, $fmtPN, $lastDate);
$msgCount += $this->smsMapper->countMessagesForPhoneNumber($this->userId, $fmtPN);
$fmtPNCleaned = preg_replace("#[ ]|[-]|[(]|[)]#","", $fmtPN);
if (!in_array($fmtPNCleaned, $cleanedPhones)) {
$phoneNumbers[] = $fmtPN;
$cleanedPhones[] = $fmtPNCleaned;
}
} }
} }
else { else {
// remove slashes $messages = $this->smsMapper->getAllMessagesForPhoneNumber($this->userId, $phoneNumber, $lastDate);
$fmtPN = preg_replace("#[/]#"," ", $phoneNumber); $msgCount = $this->smsMapper->countMessagesForPhoneNumber($this->userId, $phoneNumber);
if(isset($peerNumber[$fmtPN])) {
$messages = $this->smsMapper->getAllMessagesForPhoneNumber($this->userId, $fmtPN, $lastDate); foreach($peerNumber[$fmtPN] as $cnumber) {
$msgCount = $this->smsMapper->countMessagesForPhoneNumber($this->userId, $fmtPN); $messages = $messages + $this->smsMapper->getAllMessagesForPhoneNumber($this->userId, $cnumber, $lastDate);
$msgCount += $this->smsMapper->countMessagesForPhoneNumber($this->userId, $cnumber);
$fmtPNCleaned = preg_replace("#[ ]|-|\(|\)]#","", $fmtPN); }
if (!in_array($fmtPNCleaned, $cleanedPhones)) {
$phoneNumbers[] = $fmtPN;
$cleanedPhones[] = $fmtPNCleaned;
} }
$phoneNumbers[] = FormatPhoneNumber::formatPhoneNumber($phoneNumber);
} }
// Order by id (date) // Order by id (date)
ksort($messages); ksort($messages);
// Set the last read message for the conversation (all phone numbers) // Set the last read message for the conversation (all phone numbers)
if (count($messages) > 0) { if (count($messages) > 0) {
$maxDate = max(array_keys($messages)); $maxDate = max(array_keys($messages));

View File

@ -14,6 +14,8 @@ namespace OCA\OcSms\Db;
use \OCP\IDb; use \OCP\IDb;
use \OCP\AppFramework\Db\Mapper; use \OCP\AppFramework\Db\Mapper;
use \OCA\OcSms\AppInfo\OcSmsApp;
use \OCA\OcSms\AppInfo\FormatPhoneNumber;
class SmsMapper extends Mapper { class SmsMapper extends Mapper {
/* /*
@ -77,38 +79,77 @@ class SmsMapper extends Mapper {
$phoneList = array(); $phoneList = array();
while($row = $result->fetchRow()) { while($row = $result->fetchRow()) {
if (!in_array($row["sms_address"], $phoneList)) { $pn = $row["sms_address"];
array_push($phoneList, $row["sms_address"]); if (!in_array($pn, $phoneList)) {
array_push($phoneList, $pn);
} }
} }
return $phoneList; return $phoneList;
} }
/*
get all possible SMS_adresses for a given formated phonenumber
*/
public function getAllPhoneNumbersForFPN ($userId,$phoneNumber) {
$query = \OCP\DB::prepare('SELECT sms_address FROM ' .
'*PREFIX*ocsms_smsdatas WHERE user_id = ? AND sms_mailbox IN (?,?)');
$result = $query->execute(array($userId, 0, 1));
$phoneList = array();
while($row = $result->fetchRow()) {
$pn = $row["sms_address"];
$fmtPN = FormatPhoneNumber::formatPhoneNumber($pn);
if (!isset($phoneList[$fmtPN])) {
$phoneList[$fmtPN] = array();
}
if(!isset($phoneList[$fmtPN][$pn])) {
$phoneList[$fmtPN][$pn] = 0;
}
$phoneList[$fmtPN][$pn] += 1;
}
$fpn = FormatPhoneNumber::formatPhoneNumber($phoneNumber);
if(isset($phoneList[$fpn])){
return $phoneList[$fpn];
}
else {
return array();
}
}
public function getAllMessagesForPhoneNumber ($userId, $phoneNumber, $minDate = 0) { public function getAllMessagesForPhoneNumber ($userId, $phoneNumber, $minDate = 0) {
$phlst = $this->getAllPhoneNumbersForFPN ($userId,$phoneNumber);
$messageList = array();
$query = \OCP\DB::prepare('SELECT sms_date, sms_msg, sms_type FROM ' . $query = \OCP\DB::prepare('SELECT sms_date, sms_msg, sms_type FROM ' .
'*PREFIX*ocsms_smsdatas WHERE user_id = ? AND sms_address = ? ' . '*PREFIX*ocsms_smsdatas WHERE user_id = ? AND sms_address = ? ' .
'AND sms_mailbox IN (?,?) AND sms_date > ?'); 'AND sms_mailbox IN (?,?) AND sms_date > ?');
$result = $query->execute(array($userId, $phoneNumber, 0, 1, $minDate));
$messageList = array(); foreach( $phlst as $pn => $val) {
while ($row = $result->fetchRow()) { $result = $query->execute(array($userId, $pn, 0, 1, $minDate));
$messageList[$row["sms_date"]] = array(
"msg" => $row["sms_msg"], while ($row = $result->fetchRow()) {
"type" => $row["sms_type"] $messageList[$row["sms_date"]] = array(
); "msg" => $row["sms_msg"],
"type" => $row["sms_type"]
);
}
} }
return $messageList; return $messageList;
} }
public function countMessagesForPhoneNumber ($userId, $phoneNumber) { public function countMessagesForPhoneNumber ($userId, $phoneNumber) {
$cnt = 0;
$phlst = $this->getAllPhoneNumbersForFPN ($userId,$phoneNumber);
$query = \OCP\DB::prepare('SELECT count(sms_date) as ct FROM ' . $query = \OCP\DB::prepare('SELECT count(sms_date) as ct FROM ' .
'*PREFIX*ocsms_smsdatas WHERE user_id = ? AND sms_address = ? ' . '*PREFIX*ocsms_smsdatas WHERE user_id = ? AND sms_address = ? ' .
'AND sms_mailbox IN (?,?)'); 'AND sms_mailbox IN (?,?)');
$result = $query->execute(array($userId, $phoneNumber, 0, 1));
if ($row = $result->fetchRow()) { foreach( $phlst as $pn => $val) {
return $row["ct"]; $result = $query->execute(array($userId, $pn, 0, 1));
if ($row = $result->fetchRow())
$cnt += $row["ct"];
} }
return $cnt;
} }
public function getLastMessageTimestampForAllPhonesNumbers ($userId, $order = true) { public function getLastMessageTimestampForAllPhonesNumbers ($userId, $order = true) {
@ -125,7 +166,7 @@ class SmsMapper extends Mapper {
$phoneList = array(); $phoneList = array();
while ($row = $result->fetchRow()) { while ($row = $result->fetchRow()) {
$phoneNumber = preg_replace("#[ ]#", "/", $row["sms_address"]); $phoneNumber = $row["sms_address"];
if (!in_array($phoneNumber, $phoneList)) { if (!in_array($phoneNumber, $phoneList)) {
$phoneList[$phoneNumber] = $row["mx"]; $phoneList[$phoneNumber] = $row["mx"];
} }
@ -201,7 +242,6 @@ class SmsMapper extends Mapper {
$userId, (int) $sms["_id"] $userId, (int) $sms["_id"]
)); ));
} }
$query = \OCP\DB::prepare('INSERT INTO *PREFIX*ocsms_smsdatas ' . $query = \OCP\DB::prepare('INSERT INTO *PREFIX*ocsms_smsdatas ' .
'(user_id, added, lastmodified, sms_flags, sms_date, sms_id,' . '(user_id, added, lastmodified, sms_flags, sms_date, sms_id,' .
'sms_address, sms_msg, sms_mailbox, sms_type) VALUES ' . 'sms_address, sms_msg, sms_mailbox, sms_type) VALUES ' .