2019-06-19 14:14:10 +01:00
< ? php if ( ! defined ( 'BASEPATH' )) exit ( 'No direct script access allowed' );
/*
Controller to interact with the Clublog API
*/
class Clublog extends CI_Controller {
// Show frontend if there is one
public function index () {
2019-06-19 17:36:33 +01:00
$this -> config -> load ( 'config' );
2019-06-19 14:14:10 +01:00
}
// Upload ADIF to Clublog
2022-09-11 15:02:31 +02:00
public function upload () {
$this -> load -> model ( 'clublog_model' );
$users = $this -> clublog_model -> get_clublog_users ();
2026-05-28 13:42:41 +01:00
$uploaded_any_qsos = false ;
2022-09-11 15:02:31 +02:00
foreach ( $users as $user ) {
2026-05-28 13:42:41 +01:00
$uploaded_any_qsos = $this -> uploadUser ( $user -> user_id , $user -> user_clublog_name , $user -> user_clublog_password ) || $uploaded_any_qsos ;
}
if ( ! $uploaded_any_qsos ) {
echo 'Nothing awaiting upload to Clublog.' . " <br> " ;
log_message ( 'info' , 'Nothing awaiting upload to Clublog.' );
2022-09-11 15:02:31 +02:00
}
}
2019-10-05 19:26:07 +01:00
2022-09-11 15:02:31 +02:00
function uploadUser ( $userid , $username , $password ) {
2019-10-05 19:26:07 +01:00
$clean_username = $this -> security -> xss_clean ( $username );
2022-09-11 15:02:31 +02:00
$clean_passord = $this -> security -> xss_clean ( $password );
$clean_userid = $this -> security -> xss_clean ( $userid );
2019-10-05 19:26:07 +01:00
2025-10-13 13:40:56 +01:00
// Validate that username is an email address for Clublog
if ( ! empty ( $clean_username ) && ! filter_var ( $clean_username , FILTER_VALIDATE_EMAIL )) {
echo " Error: Clublog username must be a valid email address. Clublog no longer accepts callsigns as usernames for " . $clean_username . " <br> " ;
log_message ( 'error' , 'Clublog upload failed for user ID ' . $clean_userid . ': invalid email format for username ' . $clean_username );
2026-05-28 13:42:41 +01:00
return false ;
2025-10-13 13:40:56 +01:00
}
2019-06-19 17:36:33 +01:00
$this -> config -> load ( 'config' );
2019-06-19 17:14:07 +01:00
ini_set ( 'memory_limit' , '-1' );
2019-06-19 17:16:17 +01:00
ini_set ( 'display_errors' , 1 );
ini_set ( 'display_startup_errors' , 1 );
error_reporting ( E_ALL );
2019-06-19 17:19:05 +01:00
2019-06-19 14:48:06 +01:00
$this -> load -> helper ( 'file' );
2019-06-19 15:00:16 +01:00
$this -> load -> model ( 'clublog_model' );
2026-08-02 22:21:27 +01:00
// Retrieve all station profiles for the user with Clublog upload enabled and their QSO counts
2022-09-11 15:02:31 +02:00
$station_profiles = $this -> clublog_model -> all_with_count ( $clean_userid );
2019-06-19 16:04:15 +01:00
2019-09-26 13:05:28 +01:00
if ( $station_profiles -> num_rows ()){
2026-05-28 13:42:41 +01:00
$uploaded_for_user = false ;
2019-09-26 13:05:28 +01:00
foreach ( $station_profiles -> result () as $station_row )
{
2025-05-21 17:12:22 +01:00
// Only process stations that have QSOs to upload
2019-09-26 13:05:28 +01:00
if ( $station_row -> qso_total > 0 ) {
2025-05-21 17:12:22 +01:00
// Get QSOs for this station that haven't been uploaded to Clublog yet
2022-09-11 15:02:31 +02:00
$data [ 'qsos' ] = $this -> clublog_model -> get_clublog_qsos ( $station_row -> station_id );
2019-06-19 16:51:46 +01:00
2019-09-26 13:19:37 +01:00
if ( $data [ 'qsos' ] -> num_rows ()){
2025-05-21 17:12:22 +01:00
// Generate ADIF file content from the view template
2019-09-26 13:19:37 +01:00
$string = $this -> load -> view ( 'adif/data/clublog' , $data , TRUE );
2019-06-19 16:04:15 +01:00
2025-05-21 17:12:22 +01:00
// Generate a unique ID for the temporary file
2019-09-26 13:19:37 +01:00
$ranid = uniqid ();
2019-06-19 16:04:15 +01:00
2025-05-21 17:12:22 +01:00
// Write the ADIF data to a temporary file
2019-09-26 13:19:37 +01:00
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.' ;
2019-09-26 13:05:28 +01:00
}
2019-09-26 13:19:37 +01:00
else {
2025-05-21 17:12:22 +01:00
// Get details of the created ADIF file
2019-09-26 13:19:37 +01:00
$file_info = get_file_info ( 'uploads/clublog' . $ranid . $station_row -> station_id . '.adi' );
2025-05-21 17:12:22 +01:00
// Initialize the CURL request to Clublog's API endpoint
2019-09-26 13:19:37 +01:00
$request = curl_init ( 'https://clublog.org/putlogs.php' );
2026-05-28 13:40:47 +01:00
$filepath = FCPATH . ltrim ( $file_info [ 'server_path' ], '/\\' );
if ( ! file_exists ( $filepath ) && ! empty ( $this -> config -> item ( 'directory' ))) {
$document_root = rtrim (( string )( $_SERVER [ 'DOCUMENT_ROOT' ] ? ? '' ), '/\\' );
$install_dir = trim (( string ) $this -> config -> item ( 'directory' ), '/\\' );
if ( $document_root !== '' ) {
$filepath = $document_root . '/' . $install_dir . '/' . ltrim ( $file_info [ 'server_path' ], '/\\' );
}
2019-09-26 13:19:37 +01:00
}
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 (
2022-09-11 15:02:31 +02:00
'email' => $clean_username ,
'password' => $clean_passord ,
2019-09-26 13:19:37 +01:00
'callsign' => $station_row -> station_callsign ,
'api' => " a11c3235cd74b88212ce726857056939d52372bd " ,
'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 )) {
2020-11-28 20:00:07 +00:00
echo " QSOs uploaded and Logbook QSOs marked as sent to Clublog " . " <br> " ;
2026-05-28 13:42:41 +01:00
$uploaded_for_user = true ;
2019-09-26 13:19:37 +01:00
$this -> load -> model ( 'clublog_model' );
$this -> clublog_model -> mark_qsos_sent ( $station_row -> station_id );
2020-11-28 20:00:07 +00:00
echo " Clublog upload for " . $station_row -> station_callsign . " <br> " ;
2019-10-09 21:39:12 +01:00
log_message ( 'info' , 'Clublog upload for ' . $station_row -> station_callsign . ' successfully sent.' );
2019-09-26 13:19:37 +01:00
} else {
echo " Error " . $response ;
2019-10-09 21:39:12 +01:00
log_message ( 'error' , 'Clublog upload for ' . $station_row -> station_callsign . ' failed reason ' . $response );
2025-05-21 16:47:57 +01:00
// If Clublog responds with a 403
if ( $info [ 'http_code' ] == 403 ) {
$this -> load -> model ( 'clublog_model' );
echo " Clublog API access denied for " . $station_row -> station_callsign . " <br> " ;
log_message ( 'error' , 'Clublog API access denied for ' . $station_row -> station_callsign );
2026-08-02 22:32:50 +01:00
$this -> clublog_model -> reset_clublog_user_fields ( $station_row -> user_id , true , 'Clublog batch upload failed with HTTP 403 for station ' . $station_row -> station_callsign . '.' );
2025-05-21 16:47:57 +01:00
}
2019-09-26 13:19:37 +01:00
}
2019-10-05 19:21:07 +01:00
// Delete the ADIF file used for clublog
unlink ( 'uploads/clublog' . $ranid . $station_row -> station_id . '.adi' );
2019-10-09 21:39:12 +01:00
2019-09-26 13:05:28 +01:00
}
2019-09-26 13:19:37 +01:00
} else {
2020-11-28 20:00:07 +00:00
echo " Nothing awaiting upload to clublog for " . $station_row -> station_callsign . " <br> " ;
2019-10-09 21:39:12 +01:00
log_message ( 'info' , 'Nothing awaiting upload to clublog for ' . $station_row -> station_callsign );
2019-09-26 13:05:28 +01:00
}
}
2026-05-28 13:42:41 +01:00
2019-06-19 16:04:15 +01:00
}
2026-05-28 13:42:41 +01:00
2026-08-02 22:21:27 +01:00
return $uploaded_for_user ;
2019-06-19 16:42:04 +01:00
}
2026-08-02 22:21:27 +01:00
return false ;
2019-06-19 16:42:04 +01:00
}
2019-06-19 18:03:48 +01:00
2019-09-26 13:05:28 +01:00
function markqso ( $station_id ) {
2019-10-05 19:26:07 +01:00
$clean_station_id = $this -> security -> xss_clean ( $station_id );
2019-06-20 15:21:05 +01:00
$this -> load -> model ( 'clublog_model' );
2019-10-05 19:26:07 +01:00
$this -> clublog_model -> mark_qsos_sent ( $clean_station_id );
2019-06-19 18:03:48 +01:00
}
2019-06-20 15:53:57 +01:00
2025-05-21 17:12:22 +01:00
function markallnotsent ( $station_id ) {
2019-10-05 19:26:07 +01:00
$clean_station_id = $this -> security -> xss_clean ( $station_id );
2019-06-20 15:53:57 +01:00
$this -> load -> model ( 'clublog_model' );
2019-10-05 19:26:07 +01:00
$this -> clublog_model -> mark_all_qsos_notsent ( $clean_station_id );
2019-06-20 15:53:57 +01:00
}
2019-08-16 12:11:46 +01:00
// Find DXCC
function find_dxcc ( $callsign ) {
2019-10-05 19:26:07 +01:00
$clean_callsign = $this -> security -> xss_clean ( $callsign );
2019-08-16 12:11:46 +01:00
// Live lookup against Clublogs API
2019-10-08 20:53:14 +01:00
$url = " https://clublog.org/dxcc?call= " . $clean_callsign . " &api=a11c3235cd74b88212ce726857056939d52372bd&full=1 " ;
2019-08-16 12:11:46 +01:00
$json = file_get_contents ( $url );
$data = json_decode ( $json , TRUE );
// echo ucfirst(strtolower($data['Name']));
return $data ;
}
2019-06-19 16:42:04 +01:00
2019-10-08 20:53:14 +01:00
}