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; }
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; }