コード例 #1
0
ファイル: communicator.php プロジェクト: leehankyeol/JaWeTip
 function sendComment($args, $manual_data = null)
 {
     $result = new Object();
     set_time_limit(0);
     $oSocialxeModel =& getModel('socialxe');
     if ($manual_data) {
         $logged_provider_list = $manual_data->logged_provider_list;
         $master_provider = $manual_data->master_provider;
         $slave_provider = $manual_data->slave_provider;
     } else {
         $logged_provider_list = $this->providerManager->getLoggedProviderList();
         $master_provider = $this->providerManager->getMasterProvider();
         $slave_provider = $this->providerManager->getSlaveProvider();
     }
     $config = $this->config;
     // $logged_provider_list에서 xe 제외
     if ($logged_provider_list[0] == 'xe') {
         array_shift($logged_provider_list);
     }
     // 데이터 준비
     $comment->content = $args->content;
     $comment->content_link = $args->content_link;
     $comment->hashtag = $config->hashtag;
     $comment->content_title = $args->content_title;
     $comment->content_thumbnail = $args->content_thumbnail;
     // 대댓글이면 부모 댓글의 정보를 준비
     if ($args->parent_srl) {
         $output = $oSocialxeModel->getSocialByCommentSrl($args->parent_srl);
         $comment->parent = $output->data;
     }
     // 내용을 분석해서 각 소셜 서비스의 리플 형식이 들어있는지 확인
     $reply_provider_list = $this->providerManager->getReplyProviderList($comment->content);
     // 보낼 필요가 있는지 확인
     if (count($reply_provider_list) == 0) {
         // 대댓글이면
         if ($args->parent_srl) {
             // 부모 댓글에 소셜 정보가 없으면 리턴~
             if (!$comment->parent->provider || $comment->parent->provider == 'xe') {
                 return new Object();
             }
         } else {
             // 로그인한 소셜 서비스가 없으면 리턴~
             if (!count($logged_provider_list)) {
                 return new Object();
             }
         }
     }
     $args->url = $this->_getCommentUrl($comment->content_link, $comment->parent->comment_srl);
     if ($config->use_short_url != 'N') {
         // 생성된 짧은 주소가 있는지 확인한다.
         $output = executeQuery('socialxe.getBitlyByUrl', $args);
         $comment->short_link = $output->data->short_url;
         // 생성된 짧은 주소가 없으며 생성
         if ($this->config->bitly_username && $this->config->bitly_api_key && !$comment->short_link) {
             // bit.ly 라이브러리 로드
             if (!class_exists("bitly_SocialXE")) {
                 require_once _XE_PATH_ . 'modules/socialxe/bitly.php';
             }
             // 링크 생성
             $bitly = new bitly_SocialXE($this->config->bitly_username, $this->config->bitly_api_key);
             $content_link = $bitly->shorten(urlencode($this->_getCommentUrl($comment->content_link, $comment->parent->comment_srl)));
             if ($content_link) {
                 $comment->short_link = $content_link;
             }
         }
     } else {
         $comment->short_link = $args->url;
     }
     // API 요청 준비
     $data = array('client' => $config->client_token, 'comment' => $comment, 'logged_provider_list' => $logged_provider_list, 'reply_provider_list' => $reply_provider_list, 'master_provider' => $master_provider, 'uselang' => Context::getLangType());
     // 소셜 서비스 액세스 정보 준비
     if ($manual_data) {
         $accesses = $manual_data->access;
     } else {
         $accesses = $this->providerManager->getAccesses();
     }
     foreach ($accesses as $provider => $access) {
         $data[$provider] = serialize($access);
     }
     // URL 생성
     $url = $this->getURL('send', $data);
     // 요청
     $content = $this->httpRequest($url, 'POST');
     //debug :@kakikaki
     debugPrint('$url : ' . $url);
     debugPrint('$content : ' . $content);
     //end
     if (!$content) {
         $result->setError(-1);
         $result->setMessage('msg_request_error');
         //여기서 에러 발생 (댓글 작성 : XE-1.7.4)
         return $result;
     }
     // JSON 디코딩
     $json = new Services_JSON_SocialXE();
     $output = $json->decode($content);
     if (!$output) {
         return new Object(-1, $content);
     }
     // 오류 체크
     if ($output->error) {
         $result->setError(-1);
         $result->setMessage($output->message);
         return $result;
     }
     // 전송 결과를 체크
     $msg = array();
     $lang_provider = Context::getLang('provider');
     foreach ($this->providerManager->getProviderList() as $provider) {
         if ($output->result->{$provider}->error) {
             $msg[] = sprintf(Context::getLang('msg_send_failed'), $lang_provider[$provider], $output->result->{$provider}->error);
         }
     }
     if (count($msg)) {
         $msg = implode("\n", $msg);
         $result->add('msg', $msg);
     }
     if ($config->use_short_url != 'N') {
         // bit.ly 결과를 저장한다.
         if ($bitly) {
             $bitly_result = $bitly->getRawResults();
             $args->hash = $bitly_result['userHash'];
             $args->title = $comment->content_title;
             $args->short_url = $comment->short_link;
             $args->url = $this->_getCommentUrl($comment->content_link, $comment->parent->comment_srl);
             executeQuery('socialxe.insertBitly', $args);
         }
     }
     // 대표 계정의 댓글 번호를 세팅한다.
     if ($master_provider == 'xe' && $slave_provider) {
         $comment_id = $output->result->{$slave_provider}->id;
     } else {
         if ($master_provider) {
             $comment_id = $output->result->{$master_provider}->id;
         }
     }
     $result->add('comment_id', $comment_id);
     return $result;
 }
コード例 #2
0
ファイル: communicator.php プロジェクト: leehankyeol/JaWeTip
 function send()
 {
     // 응답 형식은 JSON로
     Context::setRequestMethod('JSON');
     //debug :@kakikaki
     debugPrint('send 진입');
     //debug end
     // 클라이언트 버전이 0.9.1보다 낮으면 우선 요청 데이터 처리를 호출해준다.
     if ($this->client_ver < '0.9.1') {
         $name_list = array('comment', 'master_provider', 'logged_provider_list', 'reply_provider_list', 'client', 'uselang', 'twitter', 'me2day', 'facebook', 'yozm');
         $this->getRequestData($name_list);
     }
     if ($this->client_ver < '0.9.1') {
         $comment = unserialize(urldecode($this->request_data['comment']));
         // 댓글 정보
         $master_provider = $this->request_data['master_provider'];
         // 대표 계정
         $logged_provider_list = unserialize($this->request_data['logged_provider_list']);
         // 로그인한 서비스 목록
         $reply_provider_list = unserialize($this->request_data['reply_provider_list']);
         // 리플 서비스 목록
         $client_token = $this->request_data['client'];
         // 클라이언트 키
         $uselang = $this->request_data['uselang'];
         // 언어
     } else {
         $comment = $this->request_data['comment'];
         // 댓글 정보
         $master_provider = $this->request_data['master_provider'];
         // 대표 계정
         $logged_provider_list = $this->request_data['logged_provider_list'];
         // 로그인한 서비스 목록
         $reply_provider_list = $this->request_data['reply_provider_list'];
         // 리플 서비스 목록
         $client_token = $this->request_data['client'];
         // 클라이언트 키
         $uselang = $this->request_data['uselang'];
         // 언어
     }
     // 원본 주소를 저장해 둔다.
     $content_link = $comment->content_link;
     // 소셜 서비스 액세스 정보 준비
     foreach ($logged_provider_list as $provider) {
         if ($this->client_ver < '0.9.1') {
             $access[$provider] = unserialize($this->request_data[$provider]);
         } else {
             $access[$provider] = $this->request_data[$provider];
         }
     }
     // 해당 클라이언트의 사용 도메인인지 확인
     $referer_info = parse_url($comment->content_link);
     $referer_domain = str_replace('www.', '', $referer_info['host']);
     $output = $this->_checkClientDomain($request_info->client_srl, $referer_domain);
     //debug :@kakikaki
     debugPrint('$output 검증 : $output->toBool() : ' . $output->toBool());
     //debug end
     if (!$output->toBool()) {
         return $output;
     }
     // 태그 준비
     if (!$comment->hashtag) {
         $comment->hashtag = 'socialxe';
     }
     // 로그인한 서비스에 댓글을 전송한다.
     unset($output);
     $send_result = array();
     $reply = false;
     // 링크 주소
     if ($comment->short_link) {
         $comment->content_link = $comment->short_link;
     } else {
         $bitly = new bitly_SocialXE($this->config->bitly_username, $this->config->bitly_api_key);
         $comment->content_link = $bitly->shorten(urlencode($this->_getCommentUrl($content_link, $comment->parent->comment_srl)));
     }
     // 댓글이면 모두 등록
     if (!$comment->parent) {
         foreach ($logged_provider_list as $provider) {
             $output = $this->providerManager->send($provider, $comment, $access[$provider], $uselang);
             $send_result[$provider] = $output->get('result');
         }
     } else {
         if (in_array($comment->parent->provider, $logged_provider_list)) {
             // 근데 페이스북은 제외
             if ($comment->parent->provider != 'facebook') {
                 $output = $this->providerManager->send($comment->parent->provider, $comment, $access[$comment->parent->provider], $uselang);
                 $send_result[$comment->parent->provider] = $output->get('result');
                 $reply = true;
             }
         }
     }
     // 대댓글인데 리플 처리가 안 됐으면 소셜XE 계정을 이용하여 리플을 보낸다.
     if ($comment->parent && !$reply) {
         $output = $this->providerManager->send($comment->parent->provider, $comment, $this->access[$comment->parent->provider], $uselang, true);
         $send_result[$comment->parent->provider] = $output->get('result');
     }
     // 리플 리스트 중 보내지 않은 서비스가 있으면 보낸다.
     if (!is_array($send_result)) {
         $send_result = array();
     }
     $sended_provider_list = array_keys($send_result);
     foreach ($reply_provider_list as $provider) {
         if (in_array($provider, $sended_provider_list)) {
             continue;
         }
         // 먼저 사용자의 계정으로 등록을 시도
         if (in_array($provider, $logged_provider_list)) {
             $output = $this->providerManager->send($provider, $comment, $access[$provider], $uselang);
             $send_result[$comment->parent->provider] = $output->get('result');
         } else {
             $output = $this->providerManager->send($provider, $comment, $this->access[$provider], $uselang, true);
             $send_result[$comment->parent->provider] = $output->get('result');
         }
     }
     $result = new Object();
     $result->add('result', $send_result);
     return $result;
 }