diff --git a/application/config/autoload.php b/application/config/autoload.php index 4b04f39e3..3b47ec9d3 100644 --- a/application/config/autoload.php +++ b/application/config/autoload.php @@ -64,7 +64,7 @@ $autoload['libraries'] = array('database', 'session', 'curl', 'OptionsLib', 'Fre | $autoload['helper'] = array('url', 'file'); */ -$autoload['helper'] = array('url', 'security'); +$autoload['helper'] = array('url', 'security', 'language'); /* @@ -96,8 +96,17 @@ $autoload['config'] = array('cloudlog', 'bands', 'lotw'); | */ -$autoload['language'] = array('general_words'); - +$autoload['language'] = array( + 'account', + 'contesting', + 'eqsl', + 'general_words', + 'lotw', + 'menu', + 'notes', + 'qslcard', + 'qso', + ); /* | ------------------------------------------------------------------- diff --git a/application/config/migration.php b/application/config/migration.php index 36e3840a4..c4ac89623 100644 --- a/application/config/migration.php +++ b/application/config/migration.php @@ -21,7 +21,7 @@ $config['migration_enabled'] = TRUE; | be upgraded / downgraded to. | */ -$config['migration_version'] = 121; +$config['migration_version'] = 123; /* |-------------------------------------------------------------------------- diff --git a/application/controllers/Activated_grids.php b/application/controllers/Activated_grids.php index 2bbbaf844..3800fe207 100644 --- a/application/controllers/Activated_grids.php +++ b/application/controllers/Activated_grids.php @@ -1,9 +1,9 @@ lang->load(array( + 'gridsquares', + )); + } public function index() { @@ -77,21 +86,19 @@ class Activated_grids extends CI_Controller { if ($this->config->item('map_6digit_grids')) { $grid_six = strtoupper(substr($subsquare,0,6)); } - + // Check if 2 Char is in array - if(!in_array($grid_two, $array_grid_2char)){ - array_push($array_grid_2char, $grid_two); + if(!in_array($grid_two, $array_confirmed_grid_2char)){ + array_push($array_confirmed_grid_2char, $grid_two); } - - - if(!in_array($grid_four, $array_grid_4char)){ - array_push($array_grid_4char, $grid_four); + + if(!in_array($grid_four, $array_confirmed_grid_4char)){ + array_push($array_confirmed_grid_4char, $grid_four); } - - + if ($this->config->item('map_6digit_grids')) { - if(!in_array($grid_six, $array_grid_6char)){ - array_push($array_grid_6char, $grid_six); + if(!in_array($grid_six, $array_confirmed_grid_6char)){ + array_push($array_confirmed_grid_6char, $grid_six); } } } @@ -103,21 +110,19 @@ class Activated_grids extends CI_Controller { if ($this->config->item('map_6digit_grids')) { $grid_6char_confirmed = strtoupper(substr($row->SAT_SQUARE,0,6)); } - + // Check if 2 Char is in array if(!in_array($grid_2char_confirmed, $array_confirmed_grid_2char)){ - array_push($array_confirmed_grid_2char, $grid_2char_confirmed); + array_push($array_confirmed_grid_2char, $grid_2char_confirmed); } - - + if(!in_array($grid_4char_confirmed, $array_confirmed_grid_4char)){ - array_push($array_confirmed_grid_4char, $grid_4char_confirmed); + array_push($array_confirmed_grid_4char, $grid_4char_confirmed); } - - + if ($this->config->item('map_6digit_grids')) { if(!in_array($grid_6char_confirmed, $array_confirmed_grid_6char)){ - array_push($array_confirmed_grid_6char, $grid_6char_confirmed); + array_push($array_confirmed_grid_6char, $grid_6char_confirmed); } } @@ -144,21 +149,19 @@ class Activated_grids extends CI_Controller { if ($this->config->item('map_6digit_grids')) { $grid_six = strtoupper(substr($subsquare,0,6)); } - + // Check if 2 Char is in array if(!in_array($grid_two, $array_grid_2char)){ - array_push($array_grid_2char, $grid_two); + array_push($array_grid_2char, $grid_two); } - - + if(!in_array($grid_four, $array_grid_4char)){ - array_push($array_grid_4char, $grid_four); + array_push($array_grid_4char, $grid_four); } - - + if ($this->config->item('map_6digit_grids')) { if(!in_array($grid_six, $array_grid_6char)){ - array_push($array_grid_6char, $grid_six); + array_push($array_grid_6char, $grid_six); } } } @@ -170,21 +173,19 @@ class Activated_grids extends CI_Controller { if ($this->config->item('map_6digit_grids')) { $grid_six = strtoupper(substr($row->SAT_SQUARE,0,6)); } - + // Check if 2 Char is in array if(!in_array($grid_two, $array_grid_2char)){ - array_push($array_grid_2char, $grid_two); + array_push($array_grid_2char, $grid_two); } - - + if(!in_array($grid_four, $array_grid_4char)){ - array_push($array_grid_4char, $grid_four); + array_push($array_grid_4char, $grid_four); } - - + if ($this->config->item('map_6digit_grids')) { if(!in_array($grid_six, $array_grid_6char)){ - array_push($array_grid_6char, $grid_six); + array_push($array_grid_6char, $grid_six); } } @@ -205,7 +206,6 @@ class Activated_grids extends CI_Controller { return '[' . implode(',', $temp) . ']'; } - $data['grid_2char_confirmed'] = js_array($array_confirmed_grid_2char); $data['grid_4char_confirmed'] = js_array($array_confirmed_grid_4char); $data['grid_6char_confirmed'] = js_array($array_confirmed_grid_6char); @@ -219,7 +219,6 @@ class Activated_grids extends CI_Controller { $this->load->view('activated_grids/index.php'); $this->load->view('interface_assets/footer'); } - public function band($band) { @@ -257,16 +256,16 @@ class Activated_grids extends CI_Controller { // Check if 2 Char is in array if(!in_array($grid_2char_confirmed, $array_grid_2char_confirmed)){ - array_push($array_grid_2char_confirmed, $grid_2char_confirmed); + array_push($array_grid_2char_confirmed, $grid_2char_confirmed); } if(!in_array($grid_4char_confirmed, $array_grid_4char_confirmed)){ - array_push($array_grid_4char_confirmed, $grid_4char_confirmed); + array_push($array_grid_4char_confirmed, $grid_4char_confirmed); } if ($this->config->item('map_6digit_grids')) { if(!in_array($grid_6char_confirmed, $array_grid_6char_confirmed)){ - array_push($array_grid_6char_confirmed, $grid_6char_confirmed); + array_push($array_grid_6char_confirmed, $grid_6char_confirmed); } } } @@ -287,18 +286,18 @@ class Activated_grids extends CI_Controller { // Check if 2 Char is in array if(!in_array($grid_two, $array_grid_2char)){ - array_push($array_grid_2char, $grid_two); + array_push($array_grid_2char, $grid_two); } if(!in_array($grid_four, $array_grid_4char)){ - array_push($array_grid_4char, $grid_four); + array_push($array_grid_4char, $grid_four); } if ($this->config->item('map_6digit_grids')) { if(!in_array($grid_six, $array_grid_6char)){ - array_push($array_grid_6char, $grid_six); + array_push($array_grid_6char, $grid_six); } } diff --git a/application/controllers/Dashboard.php b/application/controllers/Dashboard.php index 8a4973436..afc0132d7 100644 --- a/application/controllers/Dashboard.php +++ b/application/controllers/Dashboard.php @@ -114,6 +114,13 @@ class Dashboard extends CI_Controller { } + function radio_display_component() { + $this->load->model('cat'); + + $data['radio_status'] = $this->cat->recent_status(); + $this->load->view('components/radio_display_table', $data); + } + function map() { $this->load->model('logbook_model'); diff --git a/application/controllers/Eqsl.php b/application/controllers/Eqsl.php index 2268d5535..05d70fbf9 100644 --- a/application/controllers/Eqsl.php +++ b/application/controllers/Eqsl.php @@ -8,6 +8,23 @@ class eqsl extends CI_Controller { $this->load->helper(array('form', 'url')); } + // Default view when loading controller. + public function index() { + + $this->lang->load('qslcard'); + $folder_name = "assets/qslcard"; + $data['storage_used'] = $this->sizeFormat($this->folderSize($folder_name)); + + // Render Page + $data['page_title'] = "eQSL Cards"; + + $this->load->model('eqsl_images'); + $data['qslarray'] = $this->eqsl_images->eqsl_qso_list(); + + $this->load->view('interface_assets/header', $data); + $this->load->view('eqslcard/index'); + $this->load->view('interface_assets/footer'); + } public function import() { $this->load->model('user_model'); if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); } @@ -165,16 +182,16 @@ class eqsl extends CI_Controller { $status = ""; // begin script - $ch = curl_init(); + $ch = curl_init(); // basic curl options for all requests - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); // use the URL we built curl_setopt($ch, CURLOPT_URL, $adif); - $result = curl_exec($ch); + $result = curl_exec($ch); $chi = curl_getinfo($ch); curl_close($ch); @@ -490,8 +507,8 @@ class eqsl extends CI_Controller { $image_url = $this->electronicqsl->card_image($username, urlencode($password), $callsign, $band, $mode, $year, $month, $day, $hour, $minute); $file = file_get_contents($image_url, true); - $dom = new domDocument; - $dom->loadHTML($file); + $dom = new domDocument; + $dom->loadHTML($file); $dom->preserveWhiteSpace = false; $images = $dom->getElementsByTagName('img'); @@ -500,7 +517,7 @@ class eqsl extends CI_Controller { exit; } - foreach ($images as $image) + foreach ($images as $image) { header('Content-Type: image/jpg'); $content = file_get_contents("https://www.eqsl.cc".$image->getAttribute('src')); @@ -522,6 +539,63 @@ class eqsl extends CI_Controller { } + function bulk_download_image($id) { + $this->load->library('electronicqsl'); + $this->load->model('Eqsl_images'); + + $this->load->model('logbook_model'); + $this->load->model('user_model'); + $qso_query = $this->logbook_model->get_qso($id); + $qso = $qso_query->row(); + $qso_timestamp = strtotime($qso->COL_TIME_ON); + $callsign = $qso->COL_CALL; + $band = $qso->COL_BAND; + $mode = $qso->COL_MODE; + $year = date('Y', $qso_timestamp); + $month = date('m', $qso_timestamp); + $day = date('d', $qso_timestamp); + $hour = date('H', $qso_timestamp); + $minute = date('i', $qso_timestamp); + + $query = $this->user_model->get_by_id($this->session->userdata('user_id')); + $q = $query->row(); + $username = $q->user_eqsl_name; + $password = $q->user_eqsl_password; + $error = ''; + + $image_url = $this->electronicqsl->card_image($username, urlencode($password), $callsign, $band, $mode, $year, $month, $day, $hour, $minute); + $file = file_get_contents($image_url, true); + if (strpos($file, 'Error') !== false) { + $error = rtrim(preg_replace('/^\s*Error: /', '', $file)); + return $error; + } + + $dom = new domDocument; + $dom->loadHTML($file); + $dom->preserveWhiteSpace = false; + $images = $dom->getElementsByTagName('img'); + + if(!isset($images) || count($images) == 0) { + $error = "Rate Limited"; + return $error; + } + + foreach ($images as $image) + { + $content = file_get_contents("https://www.eqsl.cc".$image->getAttribute('src')); + if ($content === false) { + $error = "No response"; + return $error; + } + $filename = uniqid().'.jpg'; + if (file_put_contents('images/eqsl_card_images/' . '/'.$filename, $content) !== false) { + $this->Eqsl_images->save_image($id, $filename); + } + } + return $error; + + } + public function tools() { // Check logged in $this->load->model('user_model'); @@ -535,6 +609,61 @@ class eqsl extends CI_Controller { $this->load->view('interface_assets/footer'); } + public function download() { + // Check logged in + $this->load->model('user_model'); + if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); } + + if ($this->input->post('eqsldownload') == 'download') { + $i = 0; + $this->load->model('eqslmethods_model'); + $qslsnotdownloaded = $this->eqslmethods_model->eqsl_not_yet_downloaded(); + $eqsl_results = array(); + foreach ($qslsnotdownloaded->result_array() as $qsl) { + $result = $this->bulk_download_image($qsl['COL_PRIMARY_KEY']); + if ($result != '') { + $errors++; + if ($result == 'Rate Limited') { + break; + } else { + $eqsl_results[] = array( + 'date' => $qsl['COL_TIME_ON'], + 'call' => $qsl['COL_CALL'], + 'mode' => $qsl['COL_MODE'], + 'submode' => $qsl['COL_SUBMODE'], + 'status' => $result, + 'qsoid' => $qsl['COL_PRIMARY_KEY'] + ); + continue; + } + } else { + $i++; + } + if ($i > 0) { + sleep(15); + } + } + $data['eqsl_results'] = $eqsl_results; + $data['eqsl_stats'] = "Successfully downloaded: ".$i." / Errors: ".count($eqsl_results); + $data['page_title'] = "eQSL Download Information"; + + $this->load->view('interface_assets/header', $data); + $this->load->view('eqsl/result'); + $this->load->view('interface_assets/footer'); + } else { + + $data['page_title'] = "eQSL Card Image Download"; + $this->load->model('eqslmethods_model'); + + $data['custom_date_format'] = $this->session->userdata('user_date_format'); + $data['qslsnotdownloaded'] = $this->eqslmethods_model->eqsl_not_yet_downloaded(); + + $this->load->view('interface_assets/header', $data); + $this->load->view('eqsl/download'); + $this->load->view('interface_assets/footer'); + } + } + public function mark_all_sent() { // Check logged in $this->load->model('user_model'); @@ -599,5 +728,49 @@ class eqsl extends CI_Controller { $status = $this->uploadQso($adif, $qsl); } } - + +// Functions for storage, these need shifted to a libary to use across Cloudlog + function folderSize($dir){ + $count_size = 0; + $count = 0; + $dir_array = scandir($dir); + foreach($dir_array as $key=>$filename){ + if($filename!=".." && $filename!="."){ + if(is_dir($dir."/".$filename)){ + $new_foldersize = foldersize($dir."/".$filename); + $count_size = $count_size+ $new_foldersize; + }else if(is_file($dir."/".$filename)){ + $count_size = $count_size + filesize($dir."/".$filename); + $count++; + } + } + } + return $count_size; + } + + function sizeFormat($bytes){ + $kb = 1024; + $mb = $kb * 1024; + $gb = $mb * 1024; + $tb = $gb * 1024; + + if (($bytes >= 0) && ($bytes < $kb)) { + return $bytes . ' B'; + + } elseif (($bytes >= $kb) && ($bytes < $mb)) { + return ceil($bytes / $kb) . ' KB'; + + } elseif (($bytes >= $mb) && ($bytes < $gb)) { + return ceil($bytes / $mb) . ' MB'; + + } elseif (($bytes >= $gb) && ($bytes < $tb)) { + return ceil($bytes / $gb) . ' GB'; + + } elseif ($bytes >= $tb) { + return ceil($bytes / $tb) . ' TB'; + } else { + return $bytes . ' B'; + } + } + } // end class diff --git a/application/controllers/Gridsquares.php b/application/controllers/Gridsquares.php index 3defd4baa..02e67a28c 100644 --- a/application/controllers/Gridsquares.php +++ b/application/controllers/Gridsquares.php @@ -14,6 +14,15 @@ class Gridsquares extends CI_Controller { * - Band page provide a band dropdown list * - Find somewhere in the main menu to add a button to it */ + function __construct() + { + parent::__construct(); + + // Load language files + $this->lang->load(array( + 'gridsquares', + )); + } public function index() { diff --git a/application/controllers/Kmlexport.php b/application/controllers/Kmlexport.php index b106900e8..711ebc688 100644 --- a/application/controllers/Kmlexport.php +++ b/application/controllers/Kmlexport.php @@ -90,17 +90,8 @@ class Kmlexport extends CI_Controller { $output .= ""; $output .= ""; - if (!file_exists('kml')) { - mkdir('kml', 0755, true); - } - - if ( ! write_file('kml/qsos.kml', $output)) { - echo 'Unable to write the file. Make sure the folder KML has write permissions.'; - } - else { - header("Content-Disposition: attachment; filename=\"qsos.kml\""); - echo $output; - } + header("Content-Disposition: attachment; filename=\"qsos.kml\""); + echo $output; } -} \ No newline at end of file +} diff --git a/application/controllers/Logbook.php b/application/controllers/Logbook.php index 74d6fe90e..66ae7b816 100644 --- a/application/controllers/Logbook.php +++ b/application/controllers/Logbook.php @@ -51,7 +51,7 @@ class Logbook extends CI_Controller { $data['results'] = $this->logbook_model->get_qsos($config['per_page'],$this->uri->segment(3)); if(!$data['results']) { - $this->session->set_flashdata('notice', $this->lang->line('error_no_logbook_found') . ' Station Logbooks'); + $this->session->set_flashdata('notice', lang('error_no_logbook_found') . ' Station Logbooks'); } // Calculate Lat/Lng from Locator to use on Maps @@ -540,16 +540,16 @@ class Logbook extends CI_Controller { } switch($this->session->userdata('user_previous_qsl_type')) { case 0: - $html .= "
Export All Satellite QSOs Confirmed on LoTW
+Export All Satellite QSOs Confirmed on LoTW
diff --git a/application/views/api/help.php b/application/views/api/help.php index a7a000b21..e422f0d49 100644 --- a/application/views/api/help.php +++ b/application/views/api/help.php @@ -16,7 +16,7 @@The Cloudlog API (Application Programming Interface) lets third party systems access Cloudlog in a controlled way. Access to the API is managed via API keys.
You will need to generate an API key for each tool you wish to use (e.g. CloudlogCAT). Generate a read-write key if the application needs to send data to Cloudlog. Generate a read-only key if the application only needs to obtain data from Cloudlog.
-API URL The API URL for this Cloudlog instance is:
+API URL The API URL for this Cloudlog instance is:
Info It's good practice to delete a key if you are no longer using the associated application.
num_rows() > 0) { ?> @@ -35,7 +35,7 @@ result() as $row) { ?>| Radio Status | +|
| + | + + + + frequency->hz_to_mhz($row['frequency']); ?> () + + | +