<commit_before><?php
/**
 * Classe de integração das notificações com o serviço One Signal para envio de Push notifications para celulares
 */

class RHSOneSignal {
    
    const DEVICE_ID_META = '_device_id';
    
    function __construct() {
        
    }
    
    private function get_app_id() {
        if (defined(ONESIGNAL_APP_ID) && !empty(ONESIGNAL_APP_ID))
            return ONESIGNAL_APP_ID;
        return null;
    }
    
    private function get_auth_key() {
        if (defined(ONESIGNAL_AUTH_KEY) && !empty(ONESIGNAL_AUTH_KEY))
            return ONESIGNAL_AUTH_KEY;
        return null;
    }
    
    public function get_user_device_id($user_id) {
        return get_user_meta($user_id, self::DEVICE_ID_META, true);
    }
    
    public function add_user_device_id($user_id, $device_id) {
        return update_user_meta($user_id, self::DEVICE_ID_META, $device_id);
    }
    
    public function delete_user_device_id($user_id, $device_id) {
        return delete_user_meta($user_id, self::DEVICE_ID_META, $device_id);
    }
    
    private function send_request($request, $endpoint, $method = 'POST') {
        
        $app_id = $this->get_app_id();
        $auth_key = $this->get_auth_key();
        
        if (empty($app_id) || empty($auth_key))
            return false;
        
        $request = array_merge($request, ['app_id' => $app_id]);
        
        return wp_remote_post('https://onesignal.com/api/v1/' . $endpoint, [
            'method' => $method,
            'headers' => ['Content-Type' => 'application/json; charset=utf-8', 'Authorization' => 'Basic ' . $auth_key],
            'body' => json_encode($request)
            
        ]);
        
    }
    
} 

global $RHSOneSignal;
$RHSOneSignal = new RHSOneSignal();<commit_msg>Métodos para adicionar tags do one signal aos usuáarios e sincronizar (refs #167)<commit_after><?php
/**
 * Classe de integração das notificações com o serviço One Signal para envio de Push notifications para celulares
 */

class RHSOneSignal {
    
    const DEVICE_ID_META = '_device_id';
    const CHANNEL_TAG_PREFIX = 'ch_';
    
    function __construct() {
        
    }
    
    private function get_app_id() {
        if (defined('ONESIGNAL_APP_ID') && !empty(ONESIGNAL_APP_ID))
            return ONESIGNAL_APP_ID;
        return null;
    }
    
    private function get_auth_key() {
        if (defined('ONESIGNAL_AUTH_KEY') && !empty(ONESIGNAL_AUTH_KEY))
            return ONESIGNAL_AUTH_KEY;
        return null;
    }
    
    public function get_user_device_id($user_id) {
        return get_user_meta($user_id, self::DEVICE_ID_META, true);
    }
    
    public function add_user_device_id($user_id, $device_id) {
        return update_user_meta($user_id, self::DEVICE_ID_META, $device_id);
    }
    
    public function delete_user_device_id($user_id, $device_id) {
        return delete_user_meta($user_id, self::DEVICE_ID_META, $device_id);
    }
    
    
    /**
     * sync channels with tags
     *
     * Sincroniza os canais que o usuário assina com as tags no OneSignal. 
     * Pega todas as tags, remove as dos canais que ele não participa mais
     * 
     * @param  int $user_id  ID do usuário
     * @return array retorno da API
     */
    function sync_user_channels($user_id) {
        $device_id = $this->get_user_device_id($user_id);
        
        if (!$device_id)
            return false;
            
        
        // Primeiro pegamos as tags todas que o device já tem cadastradas no OneSignal
        $endpoint = 'players/' . $device_id;
        $method = 'GET';
        $device = $this->send_request([], $endpoint, $method);
        $remote_tags = [];
        
        // Checamos se a resposta veio com sucesso e se existem tags
        if (is_array($device) && isset($device['body'])) {
            $body = json_decode($device['body']);
            
            if (is_object($body) && isset($body->tags)) {
                if (is_object($body->tags)) {
                    // Pegamos as tags que começam com o prefixo que usamos e colocamos em um Array
                    // que vamos usar para comparar com os canais que eles tem aqui no site
                    foreach ($body->tags as $tag => $v) {
                        if (0 === strpos($tag, self::CHANNEL_TAG_PREFIX))
                            array_push($remote_tags, $tag);
                    }
                }
            }
            
        }
        
        global $RHSNotifications;
        $user_channels = $RHSNotifications->get_user_channels($user_id);
        // Antes de comparar o array de user_channels com o de remote_tags,
        // vamos adicionar o prefixo para eles ficarem no mesmo formation
        foreach ($user_channels as $k => $ch)
            $user_channels[$k] = self::CHANNEL_TAG_PREFIX . $ch;
        
        // tags que estão no One Signal mas não estão nos canais locais e precisam ser excluídas:
        $to_exclude = array_diff($remote_tags, $user_channels);
        
        // tags que estão em user channels mas não estão no One Signal e precisam ser adicionadas
        $to_include = array_diff($user_channels, $remote_tags);
        
        // Montamos o array que vamos enviar no request
        $tagsToEdit = [];
        foreach ($to_exclude as $tag)
            $tagsToEdit[$tag] = '';
        foreach ($to_include as $tag)
            $tagsToEdit[$tag] = 1;
            
        // Montamos e enviamos o request
        $endpoint = 'players/' . $device_id;
        $method = 'PUT';
        $request = [
            'tags' => $tagsToEdit
        ];

        return $this->send_request($request, $endpoint, $method);
            
    }
    
    
    function add_user_to_channel($channel, $user_id) {
        return $this->add_remove_user_channel($channel, $user_id);
    }
    
    function delete_user_from_channel($channel, $user_id) {
        return $this->add_remove_user_channel($channel, $user_id, false);
    }
    
    private function add_remove_user_channel($channel, $user_id, $add = true) {
        
        $device_id = $this->get_user_device_id($user_id);
        
        if (!$device_id)
            return false;
        
        $value = $add ? 1 : '';
        
        $endpoint = 'players/' . $device_id;
        $method = 'PUT';
        $request = [
            'tags' => [self::CHANNEL_TAG_PREFIX . $channel => $value]
        ];
        
        return $this->send_request($request, $endpoint, $method);
        
    }
    
    
    private function send_request($request, $endpoint, $method = 'POST') {
        
        $app_id = $this->get_app_id();
        $auth_key = $this->get_auth_key();

        
        if (empty($app_id) || empty($auth_key))
            return false;
        
        $request = array_merge($request, ['app_id' => $app_id]);
        
        return wp_remote_post('https://onesignal.com/api/v1/' . $endpoint, [
            'method' => $method,
            'headers' => ['Content-Type' => 'application/json; charset=utf-8', 'Authorization' => 'Basic ' . $auth_key],
            'body' => json_encode($request)
            
        ]);
        
    }
    
} 

global $RHSOneSignal;
$RHSOneSignal = new RHSOneSignal();




{'fraction_non_alphanumeric': 0.11314475873544093, 'fraction_numerical': 0.0013865779256794233, 'mean_word_length': 2.0719761499148213, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 35, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '824368', 'n_tokens_mistral': 2283, 'n_tokens_neox': 2247, 'n_words': 508}