2019-06-19 15:00:16 +01:00
< ? php
2024-05-25 09:41:27 +02:00
class Clublog_model extends CI_Model
{
2019-06-19 15:00:16 +01:00
2025-01-30 20:38:05 +01:00
private $clublog_identifier = '608df94896cb9c5421ae748235492b43815610c9' ;
2025-01-25 09:01:53 +01:00
function get_clublog_users ( $userid = null ) {
2022-09-11 15:02:31 +02:00
$this -> db -> select ( 'user_clublog_name, user_clublog_password, user_id' );
$this -> db -> where ( 'coalesce(user_clublog_name, "") != ""' );
$this -> db -> where ( 'coalesce(user_clublog_password, "") != ""' );
2025-01-25 09:01:53 +01:00
if ( $userid !== null ) {
$this -> db -> where ( 'user_id' , $userid );
}
2022-09-11 15:02:31 +02:00
$query = $this -> db -> get ( $this -> config -> item ( 'auth_table' ));
return $query -> result ();
}
2025-01-25 09:01:53 +01:00
function uploadUser ( $userid , $username , $password , $station_id = null ) {
2024-05-25 09:41:27 +02:00
$clean_username = $this -> security -> xss_clean ( $username );
2025-11-06 07:36:25 +00:00
$clean_password = $password ; // Take password as it is from Database
2024-05-25 09:41:27 +02:00
$clean_userid = $this -> security -> xss_clean ( $userid );
2025-03-10 16:41:11 +01:00
$return = " No QSOs to upload " ;
2024-05-25 09:41:27 +02:00
$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' );
2024-09-11 10:09:43 +02:00
if ( ! $this -> load -> is_loaded ( 'AdifHelper' )) {
$this -> load -> library ( 'AdifHelper' );
}
2024-05-25 09:41:27 +02:00
2025-01-25 09:01:53 +01:00
$station_profiles = $this -> all_with_count ( $clean_userid , $station_id );
2024-05-25 09:41:27 +02:00
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 );
2025-10-07 15:42:36 +00:00
if ( $data [ 'qsos' ] -> num_rows () == 1 ) { // exactly ONE QSO --> use their realtime.api as demanded by clublog
2025-10-07 15:59:32 +00:00
$singlepush = $this -> push_qso_to_clublog ( $clean_username , $clean_password , $station_row -> station_callsign , $string , $station_id );
2025-10-07 15:51:31 +00:00
if ( $singlepush [ 'status' ] == 'OK' ) {
2025-10-07 16:14:33 +00:00
$this -> mark_qsos_sent ( $station_row -> station_id );
2025-10-07 17:01:34 +00:00
log_message ( 'info' , 'Clublog singlepush upload for ' . $station_row -> station_callsign . ' successfully sent and marked.' );
2025-10-07 15:51:31 +00:00
} else {
2025-10-08 06:41:49 +00:00
log_message ( " Error " , " Singlepush for " . $station_row -> station_id . " / " . $station_row -> station_callsign . " failed: " . $singlepush [ 'status' ]);
2025-10-07 15:51:31 +00:00
}
2024-05-25 09:41:27 +02:00
} else {
2025-10-07 15:42:36 +00:00
$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 {
2024-05-25 09:41:27 +02:00
2025-10-07 15:42:36 +00:00
// initialise the curl request
$request = curl_init ( 'https://clublog.org/putlogs.php' );
$filepath = realpath ( 'uploads/clublog' . $ranid . $station_row -> station_id . '.adi' );
2025-05-06 19:05:46 +02:00
2025-10-07 15:42:36 +00:00
// Check if the file actually exists
if ( ! file_exists ( $filepath )) {
$return .= " Clublog upload for " . $station_row -> station_callsign . ' failed. Upload file could not be created.' ;
log_message ( 'error' , $return );
return $return . " \n " ;
}
2024-05-25 09:41:27 +02:00
2025-10-07 15:42:36 +00:00
if ( function_exists ( 'curl_file_create' )) { // php 5.5+
$cFile = curl_file_create ( $filepath );
} else {
$cFile = '@' . $filepath ;
}
$cFile -> setPostFilename ( basename ( $filepath ));
// send a file
curl_setopt ( $request , CURLOPT_POST , true );
curl_setopt ( $request , CURLOPT_TIMEOUT , 10 );
curl_setopt (
$request ,
CURLOPT_POSTFIELDS ,
array (
'email' => $clean_username ,
'password' => $clean_password ,
'callsign' => $station_row -> station_callsign ,
'api' => $this -> clublog_identifier ,
'file' => $cFile
2025-05-06 19:05:46 +02:00
)
);
2024-05-25 09:41:27 +02:00
2025-10-07 15:42:36 +00:00
// output the response
curl_setopt ( $request , CURLOPT_RETURNTRANSFER , true );
$response = curl_exec ( $request );
$info = curl_getinfo ( $request );
$httpcode = curl_getinfo ( $request , CURLINFO_HTTP_CODE );
if ( curl_errno ( $request )) {
$return = curl_error ( $request );
}
// If Clublog Accepts mark the QSOs
if (( $httpcode == 200 ) || ( 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 . ' successfully sent.' ;
log_message ( 'info' , 'Clublog upload for ' . $station_row -> station_callsign . ' successfully sent and marked.' );
2025-11-07 05:24:51 +00:00
} elseif ( $httpcode == 403 ) { // New Message from clublog. HTTP 403 response check.
2025-11-06 07:36:25 +00:00
$log = " Clublog returned HTML error page for " . $station_row -> station_callsign . " (access denied) " ;
log_message ( 'Error' , $log );
$return .= $log . " <br> " ;
2025-11-09 10:33:49 +00:00
$this -> disable_sync4call ( $station_row -> station_callsign , $station_row -> station_id );
2025-10-07 15:42:36 +00:00
} else if ( preg_match ( '/too many uploads already queued/' , $response )) { // New Error, Clublog has Backlog, skip for NOW
$return = 'Clublog upload for ' . $station_row -> station_callsign . ' failed, clublog tells backlog there. Skipping whole account for this cycle. Detailled reason ' . $response . ' // HTTP:' . $httpcode . ' / ' . $return ;
2025-10-07 16:32:14 +00:00
log_message ( 'Error' , 'Clublog upload for ' . $station_row -> station_callsign . ' has become a victim of clublog-Backlog. Skipping full User for this cycle.' );
2025-10-07 15:42:36 +00:00
unlink ( 'uploads/clublog' . $ranid . $station_row -> station_id . '.adi' );
break ;
2025-10-07 17:55:05 +00:00
} else if ( preg_match ( '/No QSOs to upload/' , $response )) { // Means: Already uploaded (but not marked) - perhaps different logtool, who knows.
2025-10-07 16:14:33 +00:00
$this -> mark_qsos_sent ( $station_row -> station_id );
$return = " Clublog upload for " . $station_row -> station_callsign . ' successfully sent.' ;
log_message ( 'info' , 'Clublog No QSOs to upload for ' . $station_row -> station_callsign . '. preventive marked.' );
2025-10-07 15:42:36 +00:00
} else if ( preg_match ( '/checksum duplicate/' , $response )) { // Be safe, if Michael rolls back to 403 on duplicate
$return = " QSOs uploaded (as duplicate!) and Logbook QSOs marked as sent to Clublog " ;
$this -> mark_qsos_sent ( $station_row -> station_id );
$return .= " Clublog upload for " . $station_row -> station_callsign . ' successfully sent.' ;
log_message ( 'info' , 'Clublog DUPLICATE upload for ' . $station_row -> station_callsign . ' successfully sent and marked.' );
2025-01-31 10:18:40 +00:00
} else {
2025-10-07 15:42:36 +00:00
$return = 'Clublog upload for ' . $station_row -> station_callsign . ' failed reason ' . $response . ' // HTTP:' . $httpcode . ' / ' . $return ;
log_message ( 'error' , $return );
if ( substr ( $response , 0 , 13 ) == 'Upload denied' ) { // Deactivate Upload for Station if Clublog rejects it due to non-configured Call (prevent being blacklisted at Clublog)
2025-10-07 16:32:14 +00:00
log_message ( 'Error' , 'Deactivated upload for station ' . $station_row -> station_callsign . ' due to non-configured Call (prevent being blacklisted at Clublog.' );
2025-11-09 10:33:49 +00:00
$this -> disable_sync4call ( $station_row -> station_callsign , $station_row -> station_id );
2025-10-07 15:42:36 +00:00
} else if ( substr ( $response , 0 , 14 ) == 'Login rejected' ) { // Deactivate Upload for Station if Clublog rejects it due to wrong credentials (prevent being blacklisted at Clublog)
2025-10-07 16:32:14 +00:00
log_message ( 'Error' , 'Deactivated upload for station ' . $station_row -> station_callsign . ' due to wrong credentials (prevent being blacklisted at Clublog.' );
2025-11-09 10:33:49 +00:00
$this -> disable_sync4call ( $station_row -> station_callsign , $station_row -> station_id );
2025-10-07 15:42:36 +00:00
} else if ( $httpcode == 403 ) {
2025-10-07 16:32:14 +00:00
log_message ( 'Error' , 'Deactivated upload for station ' . $station_row -> station_callsign . ' due to 403 (prevent being blacklisted at Clublog.' );
2025-11-09 10:33:49 +00:00
$this -> disable_sync4call ( $station_row -> station_callsign , $station_row -> station_id );
2025-10-07 15:42:36 +00:00
} else {
log_message ( 'error' , 'Some uncaught exception for station ' . $station_row -> station_callsign );
}
2024-06-02 10:20:22 +00:00
}
2024-05-25 09:41:27 +02:00
2025-10-07 15:42:36 +00:00
// Delete the ADIF file used for clublog
unlink ( 'uploads/clublog' . $ranid . $station_row -> station_id . '.adi' );
}
2024-05-25 09:41:27 +02:00
}
} 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 " ;
}
2025-01-25 09:01:53 +01:00
function downloadUser ( $userid , $username , $password , $clublog_last_date = null ) {
2024-05-25 09:41:27 +02:00
$clean_username = $this -> security -> xss_clean ( $username );
2025-11-06 08:26:55 +00:00
$clean_password = $password ; // Take pw as it comes from DB
2024-05-25 09:41:27 +02:00
$clean_userid = $this -> security -> xss_clean ( $userid );
2025-01-30 16:15:16 +01:00
$return = '' ;
2024-05-25 09:41:27 +02:00
$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 ) {
2025-01-25 09:01:53 +01:00
$lastrec = $clublog_last_date ? ? $this -> clublog_last_qsl_rcvd_date ( $station_row -> station_callsign );
2025-01-29 20:39:40 +01:00
$lastrec = str_replace ( '-' , '' , $lastrec );
2025-10-08 05:10:05 +00:00
$url_params = [ 'api' => $this -> clublog_identifier ,
'email' => $clean_username ,
'password' => $clean_password ,
'callsign' => trim ( $station_row -> station_callsign ),
'startyear' => substr ( $lastrec , 0 , 4 ),
'startmonth' => substr ( $lastrec , 4 , 2 ),
'startday' => substr ( $lastrec , 6 , 2 )];
$url = 'https://clublog.org/getmatches.php?' . http_build_query ( $url_params );
2024-05-25 09:41:27 +02:00
$request = curl_init ( $url );
// recieve a file
curl_setopt ( $request , CURLOPT_RETURNTRANSFER , true );
2025-01-31 12:42:59 +00:00
curl_setopt ( $request , CURLOPT_TIMEOUT , 10 );
2024-05-25 09:41:27 +02:00
$response = curl_exec ( $request );
$info = curl_getinfo ( $request );
2025-11-07 05:24:51 +00:00
$httpcode = curl_getinfo ( $request , CURLINFO_HTTP_CODE );
2025-11-07 05:26:14 +00:00
$c_err = curl_errno ( $request );
$c_errstring = curl_error ( $request );
2024-05-25 09:41:27 +02:00
2025-10-07 17:41:07 +00:00
if ( $c_err ) {
2025-10-08 04:33:13 +00:00
$log = $c_errstring . " <br> " ;
2025-10-07 17:41:07 +00:00
log_message ( " Error " , $c_errstring . " / " . $c_err );
if ( $c_err == 7 ) { // We're victim of the Clublog Firewall
return 'Impossible to reach Clublog' ;
}
2024-05-25 09:41:27 +02:00
} elseif ( preg_match_all ( '/Login rejected/' , $response )) {
2024-06-06 09:06:54 +00:00
$this -> disable_sync4call ( $station_row -> station_callsign , $station_row -> station_ids );
2025-01-30 16:15:16 +01:00
$log = " Wrong Clublog username and password for Callsign: ' " . $station_row -> station_callsign . " '. 'LOGIN REJECTED'. " ;
log_message ( 'debug' , $log );
$return .= $log . " <br> " ;
2024-05-25 09:41:27 +02:00
} 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 );
2025-01-30 16:15:16 +01:00
$log = " The callsign ' " . $station_row -> station_callsign . " ' does not match the user account at Clublog. 'INVALID CALLSIGN'. " ;
log_message ( 'debug' , $log );
$return .= $log . " <br> " ;
2026-07-15 15:03:08 +02:00
} elseif ( $httpcode == 403 ) {
2025-11-06 07:36:25 +00:00
$log = " Clublog returned HTML error page for " . $station_row -> station_callsign . " (possibly access denied) " ;
log_message ( 'debug' , $log );
$return .= $log . " <br> " ;
$this -> disable_sync4call ( $station_row -> station_callsign , $station_row -> station_ids );
2024-05-25 09:41:27 +02:00
} 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 ) {
2025-01-30 16:15:16 +01:00
$log = " Something gone wrong while trying to Download for station(s) " . $station_row -> station_ids . " / Call: " . $station_row -> station_callsign . " / Response was: " . $response ;
log_message ( " error " , $log );
$return .= $log . " <br> " ;
2024-05-25 09:41:27 +02:00
}
2025-03-10 16:41:11 +01:00
$log = " QSOs for Callsign: ' " . $station_row -> station_callsign . " ' were successfully downloaded " ;
2025-01-30 16:15:16 +01:00
log_message ( 'info' , $log );
$return .= $log . " <br> " ;
2024-05-25 09:41:27 +02:00
}
}
2025-01-30 16:15:16 +01:00
} else {
$return = " Nothing to download " ;
2024-05-25 09:41:27 +02:00
}
return $return . " \n " ;
}
2024-06-02 10:21:45 +00:00
function mark_qsos_sent ( $station_id ) {
2019-06-19 16:04:15 +01:00
$data = array (
2026-08-11 01:19:04 +02:00
'COL_CLUBLOG_QSO_UPLOAD_DATE' => date ( 'Y-m-d H:i:s' ),
2024-05-25 09:41:27 +02:00
'COL_CLUBLOG_QSO_UPLOAD_STATUS' => " Y " ,
2019-06-19 16:04:15 +01:00
);
2019-09-26 13:05:28 +01:00
$this -> db -> where ( " station_id " , $station_id );
2024-01-13 11:30:53 +00:00
$this -> db -> group_start ();
2019-06-20 15:16:53 +01:00
$this -> db -> where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , null );
2019-06-20 15:24:54 +01:00
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " " );
2024-05-25 09:41:27 +02:00
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " N " );
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " M " );
2024-01-13 11:30:53 +00:00
$this -> db -> group_end ();
2019-06-19 16:04:15 +01:00
$this -> db -> update ( $this -> config -> item ( 'table_name' ), $data );
}
2019-06-20 15:53:57 +01:00
2024-06-02 10:21:45 +00:00
function get_clublog_qsos ( $station_id ) {
2023-04-26 12:55:59 +02:00
$this -> db -> select ( '*, dxcc_entities.name as station_country' );
2024-05-25 09:41:27 +02:00
$this -> db -> join ( 'station_profile' , 'station_profile.station_id = ' . $this -> config -> item ( 'table_name' ) . '.station_id' );
2023-04-28 15:14:59 +02:00
$this -> db -> join ( 'dxcc_entities' , 'station_profile.station_dxcc = dxcc_entities.adif' , 'left outer' );
2024-05-25 09:41:27 +02:00
$this -> db -> where ( $this -> config -> item ( 'table_name' ) . '.station_id' , $station_id );
2024-04-21 16:54:53 +02:00
$this -> db -> where ( 'station_profile.clublogignore' , 0 );
2022-09-11 15:02:31 +02:00
$this -> db -> group_start ();
$this -> db -> where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , null );
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " " );
2023-08-07 09:21:21 +00:00
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " M " );
2022-09-11 15:02:31 +02:00
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " N " );
$this -> db -> group_end ();
2024-05-25 09:41:27 +02:00
2022-09-11 15:02:31 +02:00
$query = $this -> db -> get ( $this -> config -> item ( 'table_name' ));
return $query ;
2024-05-25 09:41:27 +02:00
}
2022-09-11 15:02:31 +02:00
2024-06-02 10:21:45 +00:00
function clublog_last_qsl_rcvd_date ( $callsign ) {
2024-05-09 06:02:17 +00:00
$qso_table_name = $this -> config -> item ( 'table_name' );
$this -> db -> from ( $qso_table_name );
2024-05-25 09:41:27 +02:00
$this -> db -> join ( 'station_profile' , 'station_profile.station_id = ' . $qso_table_name . '.station_id' );
2024-05-09 06:02:17 +00:00
$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 );
$this -> db -> where ( 'COL_CLUBLOG_QSO_DOWNLOAD_DATE IS NOT NULL' );
$this -> db -> where ( 'station_profile.clublogignore' , 0 );
$this -> db -> order_by ( " COL_CLUBLOG_QSO_DOWNLOAD_DATE " , " desc " );
$this -> db -> limit ( 1 );
$query = $this -> db -> get ();
$row = $query -> row ();
2024-05-25 09:41:27 +02:00
if ( isset ( $row -> COL_CLUBLOG_QSO_DOWNLOAD_DATE )) {
2024-05-09 06:02:17 +00:00
return $row -> COL_CLUBLOG_QSO_DOWNLOAD_DATE ;
} else {
// No previous date (first time import has run?), so choose UNIX EPOCH!
// Note: date is yyyy/mm/dd format
return '19700101' ;
}
}
2024-05-09 17:38:22 +00:00
2024-06-02 10:21:45 +00:00
function disable_sync4call ( $call , $stations ) {
2026-01-20 17:45:05 +00:00
if ( empty ( $stations ) || trim ( $stations ) === '' ) {
2026-07-15 15:03:08 +02:00
return ;
2026-01-20 17:45:05 +00:00
}
$station_ids = array_filter ( explode ( " , " , $stations ), function ( $id ) {
return trim ( $id ) !== '' ;
});
if ( empty ( $station_ids )) {
2026-07-15 15:03:08 +02:00
return ;
2026-01-20 17:45:05 +00:00
}
$placeholders = implode ( ',' , array_fill ( 0 , count ( $station_ids ), '?' ));
$sql = " UPDATE station_profile SET clublogignore=1 WHERE station_callsign=? AND station_id IN ( " . $placeholders . " ) " ;
$bindings = array_merge ([ $call ], $station_ids );
$query = $this -> db -> query ( $sql , $bindings );
2024-05-09 17:38:22 +00:00
}
2024-06-02 10:21:45 +00:00
function all_enabled ( $userid ) {
2025-01-17 14:02:20 +01:00
$sql = " select sp.station_callsign, group_concat(sp.station_id) as station_ids from station_profile sp
2024-05-09 10:49:14 +00:00
inner join users u on ( u . user_id = sp . user_id )
2025-12-09 09:59:22 +00:00
where u . user_clublog_name is not null and u . user_clublog_password is not null
and trim ( u . user_clublog_name ) != '' and trim ( u . user_clublog_password ) != ''
and sp . clublogignore = 0 and u . user_id = ?
2024-05-09 10:49:14 +00:00
group by sp . station_callsign " ;
2024-05-25 09:41:27 +02:00
$query = $this -> db -> query ( $sql , $userid );
2024-05-09 10:49:14 +00:00
return $query ;
2024-05-09 06:02:17 +00:00
}
2025-01-25 09:01:53 +01:00
function all_with_count ( $userid , $station_id ) {
2024-05-25 09:41:27 +02:00
$this -> db -> select ( 'station_profile.station_id, station_profile.station_callsign, count(' . $this -> config -> item ( 'table_name' ) . '.station_id) as qso_total' );
2024-05-09 06:02:17 +00:00
$this -> db -> from ( 'station_profile' );
2024-05-25 09:41:27 +02:00
$this -> db -> join ( $this -> config -> item ( 'table_name' ), 'station_profile.station_id = ' . $this -> config -> item ( 'table_name' ) . '.station_id' , 'left' );
2024-05-09 06:02:17 +00:00
$this -> db -> group_by ( 'station_profile.station_id' );
2025-01-25 09:01:53 +01:00
if ( $station_id !== null ) {
$this -> db -> where ( 'station_profile.station_id' , $station_id );
}
2022-09-11 15:02:31 +02:00
$this -> db -> where ( 'station_profile.user_id' , $userid );
2024-04-21 16:52:16 +02:00
$this -> db -> where ( 'station_profile.clublogignore' , 0 );
2022-09-11 15:02:31 +02:00
$this -> db -> group_start ();
$this -> db -> where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , null );
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " " );
2023-08-07 09:21:21 +00:00
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " M " );
2022-09-11 15:02:31 +02:00
$this -> db -> or_where ( " COL_CLUBLOG_QSO_UPLOAD_STATUS " , " N " );
$this -> db -> group_end ();
2024-05-09 06:02:17 +00:00
return $this -> db -> get ();
2022-09-11 15:02:31 +02:00
}
2025-01-17 14:02:20 +01:00
function stations_with_clublog_enabled () {
$bindings = [];
$sql = " SELECT station_profile.station_id, station_profile.station_profile_name, station_profile.station_callsign, modc.modcount, notc.notcount, totc.totcount
FROM station_profile
LEFT OUTER JOIN (
SELECT count ( * ) modcount , station_id
FROM " . $this->config ->item('table_name') .
" WHERE COL_CLUBLOG_QSO_UPLOAD_STATUS = 'M'
group by station_id
) as modc on station_profile . station_id = modc . station_id
LEFT OUTER JOIN (
SELECT count ( * ) notcount , station_id
FROM " . $this->config ->item('table_name') .
" WHERE (coalesce(COL_CLUBLOG_QSO_UPLOAD_STATUS, '') = ''
or COL_CLUBLOG_QSO_UPLOAD_STATUS = 'N' )
group by station_id
) as notc on station_profile . station_id = notc . station_id
LEFT OUTER JOIN (
SELECT count ( * ) totcount , station_id
FROM " . $this->config ->item('table_name') .
" WHERE COL_CLUBLOG_QSO_UPLOAD_STATUS = 'Y'
group by station_id
) as totc on station_profile . station_id = totc . station_id
WHERE coalesce ( station_profile . clublogignore , 1 ) = 0
AND station_profile . user_id = ? " ;
$bindings [] = $this -> session -> userdata ( 'user_id' );
$query = $this -> db -> query ( $sql , $bindings );
return $query ;
}
2025-01-30 20:38:05 +01:00
2025-02-02 14:17:05 +00:00
function push_qso_to_clublog ( $cl_username , $cl_password , $station_callsign , $adif , $station_id ) {
2025-01-30 20:38:05 +01:00
// initialise the curl request
$returner = [];
$request = curl_init ( 'https://clublog.org/realtime.php' );
curl_setopt ( $request , CURLOPT_POST , true );
2025-01-31 12:42:59 +00:00
curl_setopt ( $request , CURLOPT_TIMEOUT , 10 );
2025-01-30 20:38:05 +01:00
curl_setopt (
$request ,
CURLOPT_POSTFIELDS ,
array (
'email' => $cl_username ,
'password' => $cl_password ,
'callsign' => $station_callsign ,
'adif' => $adif ,
'api' => $this -> clublog_identifier ,
)
);
// output the response
curl_setopt ( $request , CURLOPT_RETURNTRANSFER , true );
$response = curl_exec ( $request );
2025-01-31 10:18:40 +00:00
$httpcode = curl_getinfo ( $request , CURLINFO_HTTP_CODE );
2025-01-30 20:38:05 +01:00
if ( preg_match ( '/\bOK\b/' , $response )) {
$returner [ 'status' ] = 'OK' ;
2025-10-07 16:45:21 +00:00
} elseif ( preg_match ( '/\bDupe\b/' , $response )) {
$returner [ 'status' ] = 'OK' ;
2025-10-07 16:14:33 +00:00
} elseif ( preg_match ( '/\bUpdated QSO\b/' , $response )) {
$returner [ 'status' ] = 'OK' ;
2025-11-07 05:24:51 +00:00
} elseif ( $httpcode == 403 ) { // New Message from clublog. HTTP 403 response check.
2025-11-09 10:33:49 +00:00
log_message ( 'Error' , " Clublog returned HTML error page for " . $station_callsign . " (access denied) " );
$this -> disable_sync4call ( $station_callsign , $station_id );
2025-11-06 07:36:25 +00:00
$returner [ 'status' ] = $response ;
2025-01-30 20:38:05 +01:00
} elseif ( substr ( $response , 0 , 14 ) == 'Login rejected' ) { // Deactivate Upload for Station if Clublog rejects it due to wrong credentials (prevent being blacklisted at Clublog)
log_message ( " Error " , " Clublog deactivated for " . $cl_username . " because of wrong creds at Realtime-Pusher " );
2025-11-09 10:33:49 +00:00
$this -> disable_sync4call ( $station_callsign , $station_id );
2025-01-30 20:38:05 +01:00
$returner [ 'status' ] = $response ;
} else {
2025-01-31 10:38:01 +00:00
log_message ( " Error " , " Uncaught exception at ClubLog-RT for " . $cl_username . " / Details: " . $httpcode . " : " . $response );
2025-01-30 20:38:05 +01:00
$returner [ 'status' ] = $response ;
}
return ( $returner );
}
2019-06-19 15:00:16 +01:00
}