fix utf8 chars in sms and add tool to quota to check if a text is gsm0338 compatible

This commit is contained in:
osaajani 2021-11-05 23:59:38 +01:00
parent a39c9577b1
commit d826762e9d
2 changed files with 32 additions and 7 deletions

View File

@ -11,6 +11,7 @@
namespace adapters; namespace adapters;
use controllers\internals\Quota;
use controllers\internals\Tool; use controllers\internals\Tool;
use descartes\Router; use descartes\Router;
@ -25,6 +26,10 @@ class KannelAdapter implements AdapterInterface
const KANNEL_SENDSMS_HTTP_CODE_ACCEPTED = 202; const KANNEL_SENDSMS_HTTP_CODE_ACCEPTED = 202;
const KANNEL_SENDSMS_HTTP_CODE_QUEUED = 202; const KANNEL_SENDSMS_HTTP_CODE_QUEUED = 202;
const KANNEL_CODING_7_BITS = 0;
const KANNEL_CODING_8_BITS = 1;
const KANNEL_CODING_UCS_2 = 2;
/** /**
* DLR mask to transmit to kannel * DLR mask to transmit to kannel
* *
@ -285,6 +290,13 @@ class KannelAdapter implements AdapterInterface
'dlr-url' => $forged_dlr_url, 'dlr-url' => $forged_dlr_url,
]; ];
//If necessary, use utf8 sms to represent special chars
$use_utf8_sms = !Quota::is_gsm0338($text);
if ($use_utf8_sms)
{
$data['coding'] = self::KANNEL_CODING_8_BITS;
}
if ($this->smsc) if ($this->smsc)
{ {
$data['smsc'] = $this->smsc; $data['smsc'] = $this->smsc;

View File

@ -108,14 +108,13 @@ class Quota extends StandardController
} }
/** /**
* Compute how many credit a message represent * Check if a message can be encoded as gsm0338 or if it must be UTF8
* this function count 160 chars per SMS if it can be send as GSM 03.38 encoding and 70 chars per SMS if it can only be send as UTF8.
* *
* @param string $text : Message to send * @param string $text : Message to send
* *
* @return int : Number of credit to send this message * @return bool : True if gsm0338, false if UTF8
*/ */
public static function compute_credits_for_message($text) public static function is_gsm0338($text)
{ {
//Gsm 03.38 charset to detect if message is compatible or must use utf8 //Gsm 03.38 charset to detect if message is compatible or must use utf8
$gsm0338 = [ $gsm0338 = [
@ -144,12 +143,26 @@ class Quota extends StandardController
{ {
if (!in_array(mb_substr($text, $i, 1), $gsm0338)) if (!in_array(mb_substr($text, $i, 1), $gsm0338))
{ {
$is_gsm0338 = false; return false;
}
}
break; return true;
}
} }
/**
* Compute how many credit a message represent
* this function count 160 chars per SMS if it can be send as GSM 03.38 encoding and 70 chars per SMS if it can only be send as UTF8.
*
* @param string $text : Message to send
*
* @return int : Number of credit to send this message
*/
public static function compute_credits_for_message($text)
{
$len = mb_strlen($text);
$is_gsm0338 = self::is_gsm0338($text);
return $is_gsm0338 ? ceil($len / 160) : ceil($len / 70); return $is_gsm0338 ? ceil($len / 160) : ceil($len / 70);
} }