/** * Send SMS helper * * @global array $core_config, $user_config * @param string $username * @param mixed $sms_to * @param string $message * @param string $sms_type * @param integer $unicode * @param string $smsc * @param boolean $nofooter * @param string $sms_footer * @param string $sms_sender * @param string $sms_schedule * @param string $reference_id * @return array array($status, $sms_to, $smslog_id, $queue, $counts, $sms_count, $sms_failed) */ function sendsms_helper($username, $sms_to, $message, $sms_type = 'text', $unicode = 0, $smsc = '', $nofooter = false, $sms_footer = '', $sms_sender = '', $sms_schedule = '', $reference_id = '') { global $core_config, $user_config; // get user data if ($username && $user_config['username'] != $username) { $user_config = user_getdatabyusername($username); } if (!is_array($sms_to)) { $sms_to = explode(',', $sms_to); } // get destinations for ($i = 0; $i < count($sms_to); $i++) { if (substr(trim($sms_to[$i]), 0, 1) == '#') { if ($c_group_code = substr(trim($sms_to[$i]), 1)) { $c_gpid = phonebook_groupcode2id($user_config['uid'], $c_group_code); $members = phonebook_getdatabyid($c_gpid); foreach ($members as $member) { if (trim($member['p_num'])) { $array_sms_to[] = trim($member['p_num']); } } } } else { if (substr(trim($sms_to[$i]), 0, 1) == '@') { if ($c_username = substr(trim($sms_to[$i]), 1)) { // reference self will be ignored if ($c_username != $user_config['username']) { $array_username[] = $c_username; } } } else { $array_sms_to[] = trim($sms_to[$i]); } } } // remove duplicates destinations array_unique($array_sms_to); $sms_queued = 0; $sms_failed = 0; // sendsms if (is_array($array_sms_to) && $array_sms_to[0]) { list($ok, $to, $smslog_id, $queue, $counts) = sendsms($user_config['username'], $array_sms_to, $message, $sms_type, $unicode, $smsc, $nofooter, $sms_footer, $sms_sender, $sms_schedule); } // fixme anton - IMs doesn't count // count SMSes only for ($i = 0; $i < count($ok); $i++) { if ($ok[$i]) { $sms_count += $counts[$i]; } else { $sms_failed += $counts[$i]; } } // sendsms_im if (is_array($array_username) && $array_username[0]) { $im_sender = '@' . $user_config['username']; foreach ($array_username as $target_user) { $im_sender = '@' . $user_config['username']; if (recvsms_inbox_add(core_get_datetime(), $im_sender, $target_user, $message, '', $reference_id)) { $ok[] = '1'; $to[] = '@' . $target_user; $queue[] = md5($target_user . microtime()); $sms_count++; } } } return array($ok, $to, $smslog_id, $queue, $counts, $sms_count, $sms_failed); }
/** * Intercept on before-process stage for incoming SMS * * @param $sms_datetime incoming * SMS date/time * @param $sms_sender incoming * SMS sender * @param $message incoming * SMS message before interepted * @param $sms_receiver receiver * number that is receiving incoming SMS * @param $reference_id reference_id * data * @return array $ret */ function incoming_hook_recvsms_intercept($sms_datetime, $sms_sender, $message, $sms_receiver, $reference_id) { $ret = array(); $found_bc = FALSE; $found_pv = FALSE; // continue only when keyword does not exists $m = explode(' ', $message); if (!keyword_isavail($m[0])) { return $ret; } // get settings $settings = incoming_settings_get(); // get post rules $pre_rules = incoming_pre_rules_get(); // scan for #<sender's phonebook group code> and @<username> according to pre rules $msg = explode(' ', $message); if (count($msg) > 0) { $bc = array(); $pv = array(); for ($i = 0; $i < count($msg); $i++) { $c_text = trim($msg[$i]); // scan message for @username if ($pre_rules['match_username']) { if (substr($c_text, 0, 1) === '@') { $pv[] = strtolower(substr($c_text, 1)); $found_pv = TRUE; } } // scan message for #groupcode if ($pre_rules['match_groupcode']) { if (substr($c_text, 0, 1) === '#') { $bc[] = strtoupper(substr($c_text, 1)); $found_bc = TRUE; } } } } if ($found_bc || $found_pv) { _log("recvsms_intercept dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); } if ($found_bc) { $groups = array_unique($bc); foreach ($groups as $key => $c_group_code) { $c_uid = user_mobile2uid($sms_sender); $list = phonebook_search_group($c_uid, $c_group_code, '', TRUE); $c_gpid = $list[0]['gpid']; if ($c_uid && $c_gpid) { $c_username = user_uid2username($c_uid); _log("bc g:" . phonebook_code_clean($c_group_code) . " gpid:" . $c_gpid . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); sendsms_bc($c_username, $c_gpid, $message); _log("bc end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } } } if ($found_pv) { $users = array_unique($pv); foreach ($users as $key => $c_username) { $c_username = core_sanitize_username($c_username); if ($c_uid = user_username2uid($c_username)) { _log("pv u:" . $c_username . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:[" . $message . "] reference_id:" . $reference_id, 3, 'incoming recvsms_intercept'); recvsms_inbox_add($sms_datetime, $sms_sender, $c_username, $message, $sms_receiver, $reference_id); _log("pv end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } } } return $ret; }
/** * Add sender ID * * @param integer $uid * User ID * @param string $sender_id * Sender ID * @param string $sender_id_description * Sender ID description * @param integer $isdefault * Flag 1 for default sender ID * @param integer $isapproved * Flag 1 for approved sender ID * @return boolean TRUE when new sender ID has been added */ function sender_id_add($uid, $sender_id, $sender_id_description = '', $isdefault = 1, $isapproved = 1) { global $user_config; if (sender_id_check($uid, $sender_id)) { // not available return FALSE; } else { $default = auth_isadmin() ? (int) $isdefault : 0; $approved = auth_isadmin() ? (int) $isapproved : 0; $data_sender_id = array($sender_id => $approved); $sender_id_description = trim($sender_id_description) ? trim($sender_id_description) : $sender_id; $data_description = array($sender_id => $sender_id_description); $uid = auth_isadmin() && $uid ? $uid : $user_config['uid']; if ($uid) { registry_update($uid, 'features', 'sender_id', $data_sender_id); $ret = registry_update($uid, 'features', 'sender_id_desc', $data_description); } else { // unknown error return FALSE; } if ($ret[$sender_id]) { _log('sender ID has been added id:' . $sender_id . ' uid:' . $uid, 2, 'sender_id_add'); } else { _log('fail to add sender ID id:' . $sender_id . ' uid:' . $uid, 2, 'sender_id_add'); return FALSE; } // if default and approved if (auth_isadmin() && $default && $approved) { sender_id_default_set($uid, $sender_id); } // notify admins if user or subuser if ($user_config['status'] == 3 || $user_config['status'] == 4) { $admins = user_getallwithstatus(2); foreach ($admins as $admin) { $message_to_admins = sprintf(_('Username %s with account ID %d has requested approval for sender ID %s'), user_uid2username($uid), $uid, $sender_id); recvsms_inbox_add(core_get_datetime(), _SYSTEM_SENDER_ID_, $admin['username'], $message_to_admins); } } // added return TRUE; } }
function inboxgroup_forwardcatchall($data, $log_in_id, $sms_sender, $message) { global $core_config; logger_print("forwardcatchall id:" . $data['id'] . " s:" . $sms_sender . " r:" . $data['in_receiver'] . " m:" . $message, 3, "inboxgroup"); if ($username = user_uid2username($data['uid'])) { $users = inboxgroup_getcatchall($data['id']); $continue = false; if ($data['exclusive']) { for ($i = 0; $i < count($users); $i++) { if ($sms_sender == $users[$i]['mobile']) { $continue = true; } } } else { $continue = true; } if ($continue) { for ($i = 0; $i < count($users); $i++) { if (($sms_to = $users[$i]['mobile']) && $sms_to != $sms_sender) { //list($ok, $to, $smslog_id,$queue) = sendsms_helper($username, $sms_to, $message, 'text', 0); //logger_print("forwardcatchall sendsms smslog_id:".$smslog_id[0]." to:".$sms_to, 2, "inboxgroup"); //inboxgroup_saveoutlog($log_in_id, $smslog_id[0], 1, $users[$i]['uid']); $c_username = user_uid2username($users[$i]['uid']); recvsms_inbox_add(core_get_datetime(), $sms_sender, $c_username, $message, $data['in_receiver']); } } } } }
function simplerate_hook_rate_deduct($smslog_id) { global $core_config; logger_print("enter smslog_id:" . $smslog_id, 2, "simplerate deduct"); $db_query = "SELECT p_dst,p_footer,p_msg,uid,unicode FROM " . _DB_PREF_ . "_tblSMSOutgoing WHERE smslog_id='{$smslog_id}'"; $db_result = dba_query($db_query); if ($db_row = dba_fetch_array($db_result)) { $p_dst = $db_row['p_dst']; $p_msg = $db_row['p_msg']; $p_footer = $db_row['p_footer']; $uid = $db_row['uid']; $unicode = $db_row['unicode']; if ($p_dst && $p_msg && $uid) { // get charge $p_msg_len = strlen($p_msg) + strlen($p_footer); list($count, $rate, $charge) = rate_getcharges($uid, $p_msg_len, $unicode, $p_dst); // sender's $username = user_uid2username($uid); $credit = rate_getusercredit($username); $balance = $credit - $charge; // parent's when sender is a subuser $parent_uid = user_getparentbyuid($uid); if ($parent_uid) { $username_parent = user_uid2username($parent_uid); $credit_parent = rate_getusercredit($username_parent); $balance_parent = $credit_parent - $charge; } // if sender have parent then deduct parent first if ($parent_uid) { if (!rate_setusercredit($parent_uid, $balance_parent)) { return FALSE; } logger_print("parent uid:" . $uid . " parent_uid:" . $parent_uid . " smslog_id:" . $smslog_id . " msglen:" . $p_msg_len . " count:" . $count . " rate:" . $rate . " charge:" . $charge . " credit_parent:" . $credit_parent . " balance_parent:" . $balance_parent, 2, "simplerate deduct"); } if (rate_setusercredit($uid, $balance)) { logger_print("user uid:" . $uid . " parent_uid:" . $parent_uid . " smslog_id:" . $smslog_id . " msglen:" . $p_msg_len . " count:" . $count . " rate:" . $rate . " charge:" . $charge . " credit:" . $credit . " balance:" . $balance, 2, "simplerate deduct"); if (billing_post($smslog_id, $rate, $credit, $count, $charge)) { logger_print("deduct successful uid:" . $uid . " parent_uid:" . $parent_uid . " smslog_id:" . $smslog_id, 3, "simplerate deduct"); // if balance under credit lowest limit and never been notified then notify admins, parent_uid and uid $credit_lowest_limit = (double) $core_config['main']['credit_lowest_limit']; _log('credit_lowest_limit:' . $credit_lowest_limit . ' balance:' . $balance . ' charge:' . $charge, 3, 'simplerate deduct'); $reg = registry_search($uid, 'feature', 'credit', 'lowest_limit_notif'); $notified = $reg['feature']['credit']['lowest_limit_notif'] ? TRUE : FALSE; if ($charge && $balance && $credit_lowest_limit && $balance <= $credit_lowest_limit && !$notified) { // set notified registry_update($uid, 'feature', 'credit', array('lowest_limit_notif' => TRUE)); // notif admins $admins = user_getallwithstatus(2); foreach ($admins as $admin) { $credit_message_to_admins = sprintf(_('Username %s with account ID %d has reached lowest credit limit of %s'), $username, $uid, $credit_lowest_limit); recvsms_inbox_add(core_get_datetime(), _SYSTEM_SENDER_ID_, $admin['username'], $credit_message_to_admins); } // notif parent_uid if exists if ($parent_uid && $username_parent) { $credit_message_to_parent = sprintf(_('Your subuser with username %s and account ID %d has reached lowest credit limit of %s'), $username, $uid, $credit_lowest_limit); recvsms_inbox_add(core_get_datetime(), _SYSTEM_SENDER_ID_, $username_parent, $credit_message_to_parent); } // notif uid $sender_username = $username_parent ? $username_parent : _SYSTEM_SENDER_ID_; $credit_message_to_self = sprintf(_('You have reached lowest credit limit of %s'), $credit_lowest_limit); recvsms_inbox_add(core_get_datetime(), $sender_username, $username, $credit_message_to_self); _log('sent notification credit_lowest_limit:' . $credit_lowest_limit, 3, 'simplerate deduct'); } return TRUE; } else { logger_print("deduct failed uid:" . $uid . " parent_uid:" . $parent_uid . " smslog_id:" . $smslog_id, 3, "simplerate deduct"); return FALSE; } } else { logger_print("rate deduct failed due to unable to save to db uid:" . $uid . " parent_uid:" . $parent_uid . " smslog_id:" . $smslog_id, 3, "simplerate deduct"); } } else { logger_print("rate deduct failed due to empty data uid:" . $uid . " parent_uid:" . $parent_uid . " smslog_id:" . $smslog_id, 3, "simplerate deduct"); } } else { logger_print("rate deduct failed due to missing data uid:" . $uid . " parent_uid:" . $parent_uid . " smslog_id:" . $smslog_id, 3, "simplerate deduct"); } return FALSE; }
/** * Intercept on before-process stage for incoming SMS * * @param $sms_datetime incoming * SMS date/time * @param $sms_sender incoming * SMS sender * @param $message incoming * SMS message before interepted * @param $sms_receiver receiver * number that is receiving incoming SMS * @param $reference_id reference_id * data * @return array $ret */ function incoming_hook_recvsms_intercept($sms_datetime, $sms_sender, $message, $sms_receiver, $reference_id) { $ret = array(); $found_bc = FALSE; $found_pv = FALSE; // continue only when keyword does not exists $m = explode(' ', $message); if (!checkavailablekeyword($m[0])) { return $ret; } // get settings $settings = incoming_settings_get(); // get post rules $pre_rules = incoming_pre_rules_get(); // scan for #<sender's phonebook group code> and @<username> according to pre rules $msg = explode(' ', $message); if (count($msg) > 0) { $bc = array(); $pv = array(); for ($i = 0; $i < count($msg); $i++) { $c_text = trim($msg[$i]); // scan message for @username if ($pre_rules['match_username']) { if (substr($c_text, 0, 1) === '@') { $pv[] = strtolower(substr($c_text, 1)); $found_pv = TRUE; } } // scan message for #groupcode if ($pre_rules['match_groupcode']) { if (substr($c_text, 0, 1) === '#') { $bc[] = strtoupper(substr($c_text, 1)); $found_bc = TRUE; } } } } if ($found_bc || $found_pv) { _log("recvsms_intercept dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); } if ($found_bc) { $groups = array_unique($bc); foreach ($groups as $key => $c_group_code) { $c_group_code = strtoupper($c_group_code); $c_group_code = core_sanitize_alphanumeric($c_group_code); $c_uid = user_mobile2uid($sms_sender); if ($c_uid && ($c_gpid = phonebook_groupcode2id($c_uid, $c_group_code))) { $c_username = user_uid2username($c_uid); _log("bc g:" . $c_group_code . " gpid:" . $c_gpid . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); sendsms_bc($c_username, $c_gpid, $message); _log("bc end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } else { // check the group_code for flag_sender<>0 $db_query = "SELECT id,uid,flag_sender FROM " . _DB_PREF_ . "_featurePhonebook_group WHERE code='{$c_group_code}' AND flag_sender<>0"; $db_result = dba_query($db_query); if ($db_row = dba_fetch_array($db_result)) { $c_gpid = $db_row['id']; $c_uid = $db_row['uid']; $c_flag_sender = $db_row['flag_sender']; if ($c_flag_sender == 2) { $c_username = user_uid2username($c_uid); _log("bc mobile flag_sender:" . $c_flag_sender . " username:"******" uid:" . $c_uid . " g:" . $c_group_code . " gpid:" . $c_gpid . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); $sender = trim(phonebook_number2name($sms_sender, $c_username)); $sender = $sender ? $sender : $sms_sender; sendsms_bc($c_username, $c_gpid, $sender . ":" . $message); _log("bc mobile end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } else { if ($c_flag_sender == 1) { // check whether sms_sender belongs to c_group_code $db_query = "SELECT B.id AS id FROM " . _DB_PREF_ . "_featurePhonebook AS A\n\t\t\t\t\t\t\t\tLEFT JOIN playsms.playsms_featurePhonebook_group_contacts AS C ON A.id=C.pid\n\t\t\t\t\t\t\t\tLEFT JOIN playsms.playsms_featurePhonebook_group AS B ON B.id=C.gpid\n\t\t\t\t\t\t\t\tWHERE A.mobile LIKE '%" . substr($sms_sender, 3) . "' AND B.code='" . $c_group_code . "'"; $db_result = dba_query($db_query); if ($db_row = dba_fetch_array($db_result)) { $c_username = user_uid2username($c_uid); _log("bc mobile flag_sender:" . $c_flag_sender . " username:"******" uid:" . $c_uid . " g:" . $c_group_code . " gpid:" . $c_gpid . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:" . $message, 3, 'incoming recvsms_intercept'); $sender = trim(phonebook_number2name($sms_sender, $c_username)); $sender = $sender ? $sender : $sms_sender; sendsms_bc($c_username, $c_gpid, $sender . ":" . $message); _log("bc mobile end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } } } } } } } if ($found_pv) { $users = array_unique($pv); foreach ($users as $key => $c_username) { $c_username = core_sanitize_username($c_username); if ($c_uid = user_username2uid($c_username)) { _log("pv u:" . $c_username . " uid:" . $c_uid . " dt:" . $sms_datetime . " s:" . $sms_sender . " r:" . $sms_receiver . " m:[" . $message . "] reference_id:" . $reference_id, 3, 'incoming recvsms_intercept'); recvsms_inbox_add($sms_datetime, $sms_sender, $c_username, $message, $sms_receiver, $reference_id); _log("pv end", 3, 'incoming recvsms_intercept'); $ret['uid'] = $c_uid; $ret['hooked'] = true; } } } return $ret; }