cloudlog/application/controllers/Clublog.php
Peter Goodhall 5b3272eafc Return upload status and report no Clublog QSOs
Track and return whether any QSOs were actually uploaded to Clublog and log/report when none are pending. index(): introduced $uploaded_any_qsos and aggregate per-user upload results; if nothing uploaded, echo a message and write an info log. uploadUser(): return false on invalid Clublog username (was previously void); added $uploaded_for_user tracking while iterating station profiles and set it when Clublog responds with 'accepted'. uploadUser now returns true when QSOs were uploaded for the user, otherwise false.
2026-05-28 13:42:41 +01:00

189 lines
6.5 KiB
PHP

<?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() {
$this->config->load('config');
}
// Upload ADIF to Clublog
public function upload() {
$this->load->model('clublog_model');
$users = $this->clublog_model->get_clublog_users();
$uploaded_any_qsos = false;
foreach ($users as $user) {
$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.');
}
}
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);
// 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);
return false;
}
$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');
// Retrieve all station profiles for the user with their QSO counts
$station_profiles = $this->clublog_model->all_with_count($clean_userid);
if($station_profiles->num_rows()){
$uploaded_for_user = false;
foreach ($station_profiles->result() as $station_row)
{
// Only process stations that have QSOs to upload
if($station_row->qso_total > 0) {
// Get QSOs for this station that haven't been uploaded to Clublog yet
$data['qsos'] = $this->clublog_model->get_clublog_qsos($station_row->station_id);
if($data['qsos']->num_rows()){
// Generate ADIF file content from the view template
$string = $this->load->view('adif/data/clublog', $data, TRUE);
// Generate a unique ID for the temporary file
$ranid = uniqid();
// Write the ADIF data to a temporary file
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 {
// Get details of the created ADIF file
$file_info = get_file_info('uploads/clublog'.$ranid.$station_row->station_id.'.adi');
// Initialize the CURL request to Clublog's API endpoint
$request = curl_init('https://clublog.org/putlogs.php');
$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'], '/\\');
}
}
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' => "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)) {
echo "QSOs uploaded and Logbook QSOs marked as sent to Clublog"."<br>";
$uploaded_for_user = true;
$this->load->model('clublog_model');
$this->clublog_model->mark_qsos_sent($station_row->station_id);
echo "Clublog upload for ".$station_row->station_callsign."<br>";
log_message('info', 'Clublog 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);
// 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);
$this->clublog_model->reset_clublog_user_fields($station_row->user_id);
}
}
// 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."<br>";
log_message('info', 'Nothing awaiting upload to clublog for '.$station_row->station_callsign);
}
}
return $uploaded_for_user;
}
return false;
}
}
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);
}
function markallnotsent($station_id) {
$clean_station_id = $this->security->xss_clean($station_id);
$this->load->model('clublog_model');
$this->clublog_model->mark_all_qsos_notsent($clean_station_id);
}
// Find DXCC
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=a11c3235cd74b88212ce726857056939d52372bd&full=1";
$json = file_get_contents($url);
$data = json_decode($json, TRUE);
// echo ucfirst(strtolower($data['Name']));
return $data;
}
}