diff --git a/application/controllers/Clublog.php b/application/controllers/Clublog.php index c68bd6f7d..94e9e8a1f 100644 --- a/application/controllers/Clublog.php +++ b/application/controllers/Clublog.php @@ -1,221 +1,87 @@ -session->userdata('user_id') == '') { - echo "Maintenance Mode is active. Try again later.\n"; - redirect('user/login'); + echo "Maintenance Mode is active. Try again later.\n"; + redirect('dashboard'); } } // Show frontend if there is one - public function index() { - $this->config->load('config'); + public function index() + { + // nothing to display + redirect('dashboard'); } // Upload ADIF to Clublog - public function upload() { + public function upload() + { + $this->load->model('clublog_model'); // set the last run in cron table for the correct cron id $this->load->model('cron_model'); - $this->cron_model->set_last_run($this->router->class.'_'.$this->router->method); + $this->cron_model->set_last_run($this->router->class . '_' . $this->router->method); $users = $this->clublog_model->get_clublog_users(); - foreach ($users as $user) { - $this->uploadUser($user->user_id, $user->user_clublog_name, $user->user_clublog_password); + if (!empty($users)) { + foreach ($users as $user) { + $r = $this->clublog_model->uploadUser($user->user_id, $user->user_clublog_name, $user->user_clublog_password); + } + } else { + $r = "No user has configured Clublog."; } + + echo $r; } // Download ADIF from Clublog - public function download() { + public function download() + { $this->load->model('clublog_model'); // set the last run in cron table for the correct cron id $this->load->model('cron_model'); - $this->cron_model->set_last_run($this->router->class.'_'.$this->router->method); + $this->cron_model->set_last_run($this->router->class . '_' . $this->router->method); $users = $this->clublog_model->get_clublog_users(); - foreach ($users as $user) { - $this->downloadUser($user->user_id, $user->user_clublog_name, $user->user_clublog_password); - } - } - - function downloadUser($userid, $username, $password) { - $clean_username = $this->security->xss_clean($username); - $clean_password = $this->security->xss_clean($password); - $clean_userid = $this->security->xss_clean($userid); - - $this->config->load('config'); - ini_set('memory_limit', '-1'); - ini_set('display_errors', 1); - ini_set('display_startup_errors', 1); - error_reporting(E_ALL); - - $this->load->helper('file'); - - $this->load->model('clublog_model'); - $this->load->model('logbook_model'); - - $station_profiles = $this->clublog_model->all_enabled($clean_userid); // Fetch unique Calls per User with aggregated station_ids - if ($station_profiles->num_rows()) { - foreach ($station_profiles->result() as $station_row) { - $lastrec=$this->clublog_model->clublog_last_qsl_rcvd_date($station_row->station_callsign); - $url='https://clublog.org/getmatches.php?api=608df94896cb9c5421ae748235492b43815610c9&email='.$clean_username.'&password='.$clean_password.'&callsign='.$station_row->station_callsign.'&startyear='.substr($lastrec,0,4).'&startmonth='.substr($lastrec,4,2).'&startday='.substr($lastrec,6,2); - $request = curl_init($url); - - // recieve a file - curl_setopt($request, CURLOPT_RETURNTRANSFER, true); - $response = curl_exec($request); - $info = curl_getinfo($request); - curl_close ($request); - if(curl_errno($request)) { - echo curl_error($request); - } elseif (preg_match_all('/Invalid callsign/',$response)) { // We're trying to download calls for a station we're not granted. Disable Clublog-Transfer for that station(s) - $this->clublog_model->disable_sync4call($station_row->station_callsign,$station_row->station_ids); - } else { - try { - $cl_qsls=json_decode($response); - foreach ($cl_qsls as $oneqsl) { - $this->logbook_model->clublog_update($oneqsl[2], $oneqsl[0], $oneqsl[3], 'Y', $station_row->station_callsign, $station_row->station_ids); - } - } catch (Exception $e) { - log_message("Error","Something gone wrong while trying to Download for station(s) ".$station_row->station_ids." / Call: ".$station_row->station_callsign); - } - } - + if (!empty($users)) { + foreach ($users as $user) { + $r = $this->clublog_model->downloadUser($user->user_id, $user->user_clublog_name, $user->user_clublog_password); } + } else { + $r = "No user has configured Clublog."; } + + echo $r; } - function uploadUser($userid, $username, $password) { - $clean_username = $this->security->xss_clean($username); - $clean_passord = $this->security->xss_clean($password); - $clean_userid = $this->security->xss_clean($userid); - - $this->config->load('config'); - ini_set('memory_limit', '-1'); - ini_set('display_errors', 1); - ini_set('display_startup_errors', 1); - error_reporting(E_ALL); - - $this->load->helper('file'); - - $this->load->model('clublog_model'); - - $station_profiles = $this->clublog_model->all_with_count($clean_userid); - - if($station_profiles->num_rows()){ - foreach ($station_profiles->result() as $station_row) - { - if($station_row->qso_total > 0) { - $data['qsos'] = $this->clublog_model->get_clublog_qsos($station_row->station_id); - - if($data['qsos']->num_rows()){ - $string = $this->load->view('adif/data/clublog', $data, TRUE); - - $ranid = uniqid(); - - if ( ! write_file('uploads/clublog'.$ranid.$station_row->station_id.'.adi', $string)) { - echo 'Unable to write the file - Make the folder Upload folder has write permissions.'; - } - else { - - $file_info = get_file_info('uploads/clublog'.$ranid.$station_row->station_id.'.adi'); - - // initialise the curl request - $request = curl_init('https://clublog.org/putlogs.php'); - - if($this->config->item('directory') != "") { - $filepath = $_SERVER['DOCUMENT_ROOT']."/".$this->config->item('directory')."/".$file_info['server_path']; - } else { - $filepath = $_SERVER['DOCUMENT_ROOT']."/".$file_info['server_path']; - } - - if (function_exists('curl_file_create')) { // php 5.5+ - $cFile = curl_file_create($filepath); - } else { // - $cFile = '@' . realpath($filepath); - } - - // send a file - curl_setopt($request, CURLOPT_POST, true); - curl_setopt( - $request, - CURLOPT_POSTFIELDS, - array( - 'email' => $clean_username, - 'password' => $clean_passord, - 'callsign' => $station_row->station_callsign, - 'api' => "608df94896cb9c5421ae748235492b43815610c9", - 'file' => $cFile - )); - - // output the response - curl_setopt($request, CURLOPT_RETURNTRANSFER, true); - $response = curl_exec($request); - $info = curl_getinfo($request); - - if(curl_errno($request)) { - echo curl_error($request); - } - curl_close ($request); - - - // If Clublog Accepts mark the QSOs - if (preg_match('/\baccepted\b/', $response)) { - echo "QSOs uploaded and Logbook QSOs marked as sent to Clublog"."
"; - $this->load->model('clublog_model'); - $this->clublog_model->mark_qsos_sent($station_row->station_id); - echo "Clublog upload for ".$station_row->station_callsign."
"; - log_message('info', 'Clublog upload for '.$station_row->station_callsign.' successfully sent.'); - } else if (preg_match('/checksum duplicate/',$response)) { - echo "QSOs uploaded (asduplicate!) and Logbook QSOs marked as sent to Clublog"."
"; - $this->load->model('clublog_model'); - $this->clublog_model->mark_qsos_sent($station_row->station_id); - echo "Clublog upload for ".$station_row->station_callsign."
"; - log_message('info', 'Clublog DUPLICATE upload for '.$station_row->station_callsign.' successfully sent.'); - } else { - echo "Error ".$response."
"; - log_message('error', 'Clublog upload for '.$station_row->station_callsign.' failed reason '.$response); - } - - // Delete the ADIF file used for clublog - unlink('uploads/clublog'.$ranid.$station_row->station_id.'.adi'); - - } - - } else { - echo "Nothing awaiting upload to clublog for ".$station_row->station_callsign."
"; - - log_message('info', 'Nothing awaiting upload to clublog for '.$station_row->station_callsign); - } - } - } - } - } - - function markqso($station_id) { + function markqso($station_id) + { $clean_station_id = $this->security->xss_clean($station_id); $this->load->model('clublog_model'); $this->clublog_model->mark_qsos_sent($clean_station_id); } // Find DXCC - function find_dxcc($callsign) { + function find_dxcc($callsign) + { $clean_callsign = $this->security->xss_clean($callsign); // Live lookup against Clublogs API - $url = "https://clublog.org/dxcc?call=".$clean_callsign."&api=608df94896cb9c5421ae748235492b43815610c9&full=1"; + $url = "https://clublog.org/dxcc?call=" . $clean_callsign . "&api=608df94896cb9c5421ae748235492b43815610c9&full=1"; $json = file_get_contents($url); $data = json_decode($json, TRUE); diff --git a/application/models/Clublog_model.php b/application/models/Clublog_model.php index dee198086..326121fc6 100644 --- a/application/models/Clublog_model.php +++ b/application/models/Clublog_model.php @@ -1,8 +1,10 @@ db->select('user_clublog_name, user_clublog_password, user_id'); $this->db->where('coalesce(user_clublog_name, "") != ""'); $this->db->where('coalesce(user_clublog_password, "") != ""'); @@ -10,50 +12,221 @@ class Clublog_model extends CI_Model { return $query->result(); } - function mark_qsos_sent($station_id) { + function uploadUser($userid, $username, $password) + { + $clean_username = $this->security->xss_clean($username); + $clean_passord = $this->security->xss_clean($password); + $clean_userid = $this->security->xss_clean($userid); + + $return = "No QSO's to upload"; + + $this->config->load('config'); + + ini_set('memory_limit', '-1'); + ini_set('display_errors', 1); + ini_set('display_startup_errors', 1); + error_reporting(E_ALL); + + $this->load->helper('file'); + + $station_profiles = $this->all_with_count($clean_userid); + + if ($station_profiles->num_rows()) { + foreach ($station_profiles->result() as $station_row) { + if ($station_row->qso_total > 0) { + $data['qsos'] = $this->get_clublog_qsos($station_row->station_id); + + if ($data['qsos']->num_rows()) { + $string = $this->load->view('adif/data/clublog', $data, TRUE); + + $ranid = uniqid(); + + if (!write_file('uploads/clublog' . $ranid . $station_row->station_id . '.adi', $string)) { + $return = 'Unable to write the file - Make the folder Upload folder has write permissions.'; + } else { + + $file_info = get_file_info('uploads/clublog' . $ranid . $station_row->station_id . '.adi'); + + // initialise the curl request + $request = curl_init('https://clublog.org/putlogs.php'); + + if ($this->config->item('directory') != "") { + $filepath = $_SERVER['DOCUMENT_ROOT'] . "/" . $this->config->item('directory') . "/" . $file_info['server_path']; + } else { + $filepath = $_SERVER['DOCUMENT_ROOT'] . "/" . $file_info['server_path']; + } + + if (function_exists('curl_file_create')) { // php 5.5+ + $cFile = curl_file_create($filepath); + } else { // + $cFile = '@' . realpath($filepath); + } + + // send a file + curl_setopt($request, CURLOPT_POST, true); + curl_setopt( + $request, + CURLOPT_POSTFIELDS, + array( + 'email' => $clean_username, + 'password' => $clean_passord, + 'callsign' => $station_row->station_callsign, + 'api' => "608df94896cb9c5421ae748235492b43815610c9", + 'file' => $cFile + ) + ); + + // output the response + curl_setopt($request, CURLOPT_RETURNTRANSFER, true); + $response = curl_exec($request); + $info = curl_getinfo($request); + + if (curl_errno($request)) { + $return = curl_error($request); + } + curl_close($request); + + + // If Clublog Accepts mark the QSOs + if (preg_match('/\baccepted\b/', $response)) { + $return = "QSOs uploaded and Logbook QSOs marked as sent to Clublog"; + $this->mark_qsos_sent($station_row->station_id); + $return = "Clublog upload for " . $station_row->station_callsign; + log_message('info', 'Clublog upload for ' . $station_row->station_callsign . ' successfully sent.'); + } else if (preg_match('/checksum duplicate/', $response)) { + $return = "QSOs uploaded (asduplicate!) and Logbook QSOs marked as sent to Clublog"; + $this->mark_qsos_sent($station_row->station_id); + $return = "Clublog upload for " . $station_row->station_callsign; + log_message('info', 'Clublog DUPLICATE upload for ' . $station_row->station_callsign . ' successfully sent.'); + } else { + $return = "Error " . $response; + log_message('error', 'Clublog upload for ' . $station_row->station_callsign . ' failed reason ' . $response); + } + + // Delete the ADIF file used for clublog + unlink('uploads/clublog' . $ranid . $station_row->station_id . '.adi'); + } + } else { + + $return = "Nothing awaiting upload to clublog for " . $station_row->station_callsign; + log_message('info', 'Nothing awaiting upload to clublog for ' . $station_row->station_callsign); + } + } + } + } + log_message('info', $return); + return $return . "\n"; + } + + function downloadUser($userid, $username, $password) + { + $clean_username = $this->security->xss_clean($username); + $clean_password = $this->security->xss_clean($password); + $clean_userid = $this->security->xss_clean($userid); + + $return = "Nothing to download"; + + $this->config->load('config'); + + ini_set('memory_limit', '-1'); + ini_set('display_errors', 1); + ini_set('display_startup_errors', 1); + error_reporting(E_ALL); + + $this->load->helper('file'); + $this->load->model('logbook_model'); + + $station_profiles = $this->all_enabled($clean_userid); // Fetch unique Calls per User with aggregated station_ids + + if ($station_profiles->num_rows()) { + foreach ($station_profiles->result() as $station_row) { + $lastrec = $this->clublog_last_qsl_rcvd_date($station_row->station_callsign); + $url = 'https://clublog.org/getmatches.php?api=608df94896cb9c5421ae748235492b43815610c9&email=' . $clean_username . '&password=' . $clean_password . '&callsign=' . $station_row->station_callsign . '&startyear=' . substr($lastrec, 0, 4) . '&startmonth=' . substr($lastrec, 4, 2) . '&startday=' . substr($lastrec, 6, 2); + $request = curl_init($url); + + // recieve a file + curl_setopt($request, CURLOPT_RETURNTRANSFER, true); + $response = curl_exec($request); + $info = curl_getinfo($request); + curl_close($request); + + if (curl_errno($request)) { + $return = curl_error($request); + } elseif (preg_match_all('/Login rejected/', $response)) { + $return = "Wrong Clublog username and password for Callsign: '" . $station_row->station_callsign . "'. 'LOGIN REJECTED'."; + log_message('error', $return); + } elseif (preg_match_all('/Invalid callsign/', $response)) { // We're trying to download calls for a station we're not granted. Disable Clublog-Transfer for that station(s) + $this->disable_sync4call($station_row->station_callsign, $station_row->station_ids); + $return = "The callsign '" . $station_row->station_callsign . "' does not match the user account at Clublog. 'INVALID CALLSIGN'."; + log_message('debug', $return); + } else { + try { + $cl_qsls = json_decode($response); + foreach ($cl_qsls as $oneqsl) { + $this->logbook_model->clublog_update($oneqsl[2], $oneqsl[0], $oneqsl[3], 'Y', $station_row->station_callsign, $station_row->station_ids); + } + } catch (Exception $e) { + $return = "Something gone wrong while trying to Download for station(s) " . $station_row->station_ids . " / Call: " . $station_row->station_callsign; + log_message("error", $return); + } + + $return = "QSO's for Callsign: '" . $station_row->station_callsign . "' were successfully downloaded"; + log_message('info', $return); + } + } + } + + return $return . "\n"; + } + + function mark_qsos_sent($station_id) + { $data = array( - 'COL_CLUBLOG_QSO_UPLOAD_DATE' => date('Y-m-d'), - 'COL_CLUBLOG_QSO_UPLOAD_STATUS' => "Y", + 'COL_CLUBLOG_QSO_UPLOAD_DATE' => date('Y-m-d'), + 'COL_CLUBLOG_QSO_UPLOAD_STATUS' => "Y", ); $this->db->where("station_id", $station_id); $this->db->group_start(); $this->db->where("COL_CLUBLOG_QSO_UPLOAD_STATUS", null); $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", ""); - $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", "N"); - $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", "M"); + $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", "N"); + $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", "M"); $this->db->group_end(); $this->db->update($this->config->item('table_name'), $data); } - function mark_qso_sent($qso_id) { + function mark_qso_sent($qso_id) + { $data = array( - 'COL_CLUBLOG_QSO_UPLOAD_DATE' => date('Y-m-d'), - 'COL_CLUBLOG_QSO_UPLOAD_STATUS' => "Y", + 'COL_CLUBLOG_QSO_UPLOAD_DATE' => date('Y-m-d'), + 'COL_CLUBLOG_QSO_UPLOAD_STATUS' => "Y", ); $this->db->where("COL_PRIMARY_KEY", $qso_id); $this->db->update($this->config->item('table_name'), $data); } - function get_last_five($station_id) { + function get_last_five($station_id) + { $this->db->where('station_id', $station_id); $this->db->group_start(); $this->db->where("COL_CLUBLOG_QSO_UPLOAD_STATUS", null); $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", ""); $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", "N"); $this->db->group_end(); - $this->db->limit(5); + $this->db->limit(5); $query = $this->db->get($this->config->item('table_name')); return $query; } - function mark_all_qsos_notsent($station_id) { + function mark_all_qsos_notsent($station_id) + { $data = array( - 'COL_CLUBLOG_QSO_UPLOAD_DATE' => null, - 'COL_CLUBLOG_QSO_UPLOAD_STATUS' => "M", - 'COL_CLUBLOG_QSO_UPLOAD_STATUS' => "N", + 'COL_CLUBLOG_QSO_UPLOAD_DATE' => null, + 'COL_CLUBLOG_QSO_UPLOAD_STATUS' => "M", + 'COL_CLUBLOG_QSO_UPLOAD_STATUS' => "N", ); $this->db->where("station_id", $station_id); @@ -61,11 +234,12 @@ class Clublog_model extends CI_Model { $this->db->update($this->config->item('table_name'), $data); } - function get_clublog_qsos($station_id){ + function get_clublog_qsos($station_id) + { $this->db->select('*, dxcc_entities.name as station_country'); - $this->db->join('station_profile', 'station_profile.station_id = '.$this->config->item('table_name').'.station_id'); + $this->db->join('station_profile', 'station_profile.station_id = ' . $this->config->item('table_name') . '.station_id'); $this->db->join('dxcc_entities', 'station_profile.station_dxcc = dxcc_entities.adif', 'left outer'); - $this->db->where($this->config->item('table_name').'.station_id', $station_id); + $this->db->where($this->config->item('table_name') . '.station_id', $station_id); $this->db->where('station_profile.clublogignore', 0); $this->db->group_start(); $this->db->where("COL_CLUBLOG_QSO_UPLOAD_STATUS", null); @@ -73,17 +247,18 @@ class Clublog_model extends CI_Model { $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", "M"); $this->db->or_where("COL_CLUBLOG_QSO_UPLOAD_STATUS", "N"); $this->db->group_end(); - + $query = $this->db->get($this->config->item('table_name')); return $query; - } + } - function clublog_last_qsl_rcvd_date($callsign) { + function clublog_last_qsl_rcvd_date($callsign) + { $qso_table_name = $this->config->item('table_name'); $this->db->from($qso_table_name); - $this->db->join('station_profile', 'station_profile.station_id = '.$qso_table_name.'.station_id'); + $this->db->join('station_profile', 'station_profile.station_id = ' . $qso_table_name . '.station_id'); $this->db->where('station_profile.station_callsign', $callsign); $this->db->select("DATE_FORMAT(COL_CLUBLOG_QSO_DOWNLOAD_DATE,'%Y%m%d') AS COL_CLUBLOG_QSO_DOWNLOAD_DATE", FALSE); @@ -95,7 +270,7 @@ class Clublog_model extends CI_Model { $query = $this->db->get(); $row = $query->row(); - if (isset($row->COL_CLUBLOG_QSO_DOWNLOAD_DATE)){ + if (isset($row->COL_CLUBLOG_QSO_DOWNLOAD_DATE)) { return $row->COL_CLUBLOG_QSO_DOWNLOAD_DATE; } else { // No previous date (first time import has run?), so choose UNIX EPOCH! @@ -104,24 +279,27 @@ class Clublog_model extends CI_Model { } } - function disable_sync4call($call, $stations) { - $sql="update station_profile set clublogignore=1 where station_callsign=? and station_id in (".$stations.")"; - $query = $this->db->query($sql,$call); + function disable_sync4call($call, $stations) + { + $sql = "update station_profile set clublogignore=1 where station_callsign=? and station_id in (" . $stations . ")"; + $query = $this->db->query($sql, $call); } - function all_enabled($userid) { - $sql="select sp.station_callsign, group_concat(sp.station_id) as station_ids from station_profile sp + function all_enabled($userid) + { + $sql = "select sp.station_callsign, group_concat(sp.station_id) as station_ids from station_profile sp inner join users u on (u.user_id=sp.user_id) where u.user_clublog_name is not null and u.user_clublog_password is not null and sp.clublogignore=0 and u.user_id=? group by sp.station_callsign"; - $query = $this->db->query($sql,$userid); + $query = $this->db->query($sql, $userid); return $query; } - function all_with_count($userid) { - $this->db->select('station_profile.station_id, station_profile.station_callsign, count('.$this->config->item('table_name').'.station_id) as qso_total'); + function all_with_count($userid) + { + $this->db->select('station_profile.station_id, station_profile.station_callsign, count(' . $this->config->item('table_name') . '.station_id) as qso_total'); $this->db->from('station_profile'); - $this->db->join($this->config->item('table_name'),'station_profile.station_id = '.$this->config->item('table_name').'.station_id','left'); + $this->db->join($this->config->item('table_name'), 'station_profile.station_id = ' . $this->config->item('table_name') . '.station_id', 'left'); $this->db->group_by('station_profile.station_id'); $this->db->where('station_profile.user_id', $userid); $this->db->where('station_profile.clublogignore', 0); @@ -135,5 +313,3 @@ class Clublog_model extends CI_Model { return $this->db->get(); } } - -?>