diff --git a/hooks/hook_maxapex_tickets_ai.php b/hooks/hook_maxapex_tickets_ai.php new file mode 100644 index 0000000..180600e --- /dev/null +++ b/hooks/hook_maxapex_tickets_ai.php @@ -0,0 +1,190 @@ +join('tblhosting as th', Capsule::raw('SUBSTRING(tt.service, 2)'), '=', 'th.id') + ->join('tblservers as ts', 'th.server', '=', 'ts.id') + ->leftJoin('tblcustomfieldsvalues as cfv', function($join) { + $join->on('tt.id', '=', 'cfv.relid') + ->where('cfv.fieldid', '=', function($query) { + $query->select('id') + ->from('tblcustomfields') + ->where('fieldname', 'Issue Type (*)') + ->where('type', 'support') + ->limit(1); + }); + }) + ->where('tt.id', $tid) + ->select('tt.title', 'tt.message', 'th.domain', 'ts.name', 'ts.ipaddress', 'ts.hostname', 'cfv.value as issueType') + ->get(); + + if ($result->isEmpty()) { + return "No data found for ticket ID: " . htmlspecialchars($tid); + } + + // Add ticket information to data array + $data = []; + foreach ($result as $row) { + $data[] = [ + 'Title' => $row->title, + 'Message' => $row->message, + 'Domain' => $row->domain, + 'ServerName' => $row->name, + 'IPAddress' => $row->ipaddress, + 'Hostname' => $row->hostname, + 'IssueType' => $row->issueType + ]; + } + } catch (\Exception $e) { + return "An error occurred: " . $e->getMessage(); + } + return $data; +} + +// Get logs +function getLogs($server, $issueType) { + $client = new Client(); + try { + // GET request with a 10-second timeout + $response = $client->get('http://' . urlencode($server) . ':5000/get_logs?issue_type=' . urlencode($issueType), [ + 'headers' => [ + 'Content-Type' => 'application/json', + ], + 'timeout' => 10, // Timeout set to 10 seconds + ]); + + $responseBody = json_decode($response->getBody(), true); + return $responseBody; + } catch (Exception $e) { + logActivity('error getLogsApi: '. $e->getMessage() ); + return null; // or return a specific structure indicating failure + } +} +// Get OpenAI response +function callOpenAI($apiKey, $apiEngine, $subject, $message, $logsData) { + try { + // Constructing the prompt + $prompt = "We have received a Technical Support Ticket from a client. Having subject: $subject, ticket content: $message. Following are the server logs with file paths: $logsData. Please guide us solution of this with explanations."; + + // Data for the OpenAI API call + $requestData = array( + "model" => $apiEngine, + // "response_format" => array("type" => "json_object"), + "messages" => array( + array("role" => "system", "content" => "You are a helpful sysops. You have to guide a effective solution."), + array("role" => "user", "content" => $prompt) // Using constructed prompt + ) + ); + + $client = new Client(); + $response = $client->post('https://api.openai.com/v1/chat/completions', [ + 'headers' => [ + 'Content-Type' => 'application/json', + "Authorization" => "Bearer $apiKey" + ], + 'json' => $requestData, + ]); + + $responseArray = json_decode($response->getBody(), true); + + // Accessing choices + $choice = $responseArray['choices'][0]; + $responseBody = $choice['message']['content']; + + return $responseBody; + } catch (Exception $e) { + logActivity('error callOpenAI: '. $e->getMessage() ); + // return "Error: " . $e->getMessage(); + } +} + +// Add ticket notes +function addNotesToTicket($ticketId, $note) { + try { + $command = 'AddTicketNote'; + $postData = array( + 'ticketid' => $ticketId, + 'message' => "Suggestion by ChatGPT. + PLEASE NOTE THAT THIS MAY NOT BE CORRECT THEREFORE PLEASE READ AND UNDERSTAND CAREFULLY BEFORE DOING ANYTHING." . $note, + 'markdown' => true + //, + //'attachments' => base64_encode(json_encode([['name' => 'sample_text_file.txt', 'data' => base64_encode('This is a sample text file contents')]])), + ); + + $results = localAPI($command, $postData); + + logActivity("Ticket note added for ticket ID: {$ticketId}"); + + } catch (Exception $e) { + logActivity("Error adding ticket note: " . $e->getMessage()); + } +} + + +function openTicketHookFunc($vars) { + + // Retrieve the Ticket ID and Display Data + $tid = $vars['ticketid'] ?? ''; + + // Retrieve and display module configuration values + $aiApiKey = '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'; + $aiEngine = "gpt-3.5-turbo-1106"; + + if (!empty($tid)) { + $ticketData = getTicketData($tid); + if (is_array($ticketData)) { + foreach ($ticketData as $row) { + + // get logs + // $server = "localhost"; + // $issueType = "Demo"; + $server = htmlspecialchars($row['ServerName']); + $issueType = htmlspecialchars($row['IssueType']); + + $logsDataArray = getLogs($server, $issueType); + + if ($logsDataArray !== null) { + $logsData = ''; + + foreach ($logsDataArray as $key => $value) { + $logsData .= "\n" . "file: " . $key . "\n" . "logs: " . $value; + } + + + // Call the ChatGPT API + $openAIResponse = callOpenAI($aiApiKey, $aiEngine, $row['Title'], $row['Message'], $logsData); + + + addNotesToTicket($tid, $openAIResponse); + + } + } + } + } +}; + + +add_hook('TicketOpenAdmin', 1, function($vars) { + + // logActivity('before hooks from ARH - TicketOpenAdmin'); + + openTicketHookFunc($vars); + + // logActivity('after hooks from ARH - TicketOpenAdmin'); +}); + + +add_hook('TicketOpen', 1, function($vars) { + + // logActivity('hooks from ARH - TicketOpen'); + + openTicketHookFunc($vars); +}); +