From dbba2d22855c35e14a2b4c988bdeea0806ce7daa Mon Sep 17 00:00:00 2001
From: Nathan McRae <me@nathanmcrae.name>
Date: Wed, 5 Mar 2025 22:46:03 -0800
Subject: [PATCH] Set up basic SFTP upload

---
 .../name/nathanmcrae/numbersstation/Main.java | 41 ++++++++++++++++---
 1 file changed, 36 insertions(+), 5 deletions(-)

diff --git a/src/main/java/name/nathanmcrae/numbersstation/Main.java b/src/main/java/name/nathanmcrae/numbersstation/Main.java
index 6057b9c..23bb1ec 100644
--- a/src/main/java/name/nathanmcrae/numbersstation/Main.java
+++ b/src/main/java/name/nathanmcrae/numbersstation/Main.java
@@ -1,6 +1,9 @@
 package name.nathanmcrae.numbersstation;
 
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.Session;
 import com.jcraft.jsch.SftpException;
 import com.leakyabstractions.result.api.Result;
 import com.leakyabstractions.result.core.Results;
@@ -12,6 +15,8 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.logging.FileHandler;
 import java.util.logging.Logger;
@@ -135,11 +140,17 @@ public class Main extends Application {
             try {
                 runStation(parsedArgs);
             } catch (StationRunException e) {
-                // TODO: Add time of run
+                DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
+                String message = "Attempted to run station '" +
+                    parsedArgs.getStationName() +
+                    "' at " +
+                    LocalDateTime.now().format(dateFormatter) +
+                    "\n\n" +
+                    e.getMessage();
                 var notification = new NotificationController.NotificationParameters("Error running station '" + parsedArgs.getStationName() + "'",
-                                                                                     e.getMessage(),
-                                                                                    NotificationController.NotificationType.ERROR,
-                                                                                    Optional.empty());
+                                                                                     message,
+                                                                                     NotificationController.NotificationType.ERROR,
+                                                                                     Optional.empty());
                 startParams = new StartParameters(Optional.of(notification));
 
                 launch(args);
@@ -202,10 +213,30 @@ public class Main extends Application {
                 messageText = new String(Files.readAllBytes(nextMessagePath));
             }
 
-            // Send message using appropriate method
             switch (loadedStation.getMessageMethod()) {
                 case StationSettings.MessageMethod.SFTP:
                     //loadedStation.uploadNextMessageToSFTP();
+                    JSch jsch = new JSch();
+                    try {
+                        Session session = jsch.getSession(loadedStation.getUsername(), loadedStation.getAddress(), 22);
+                        session.setPassword(loadedStation.getPassword());
+                        session.setConfig("StrictHostKeyChecking", "no");
+                        session.connect(30000); // 30 seconds timeout
+
+                        if (session.isConnected()) {
+                            ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
+                            channel.connect();
+
+                            String localFile = loadedStation.nextMessagePath().toString();
+                            channel.put(localFile, "www/message.txt");
+                            channel.exit();
+                            session.disconnect();
+                        } else {
+                            logger.log(Level.SEVERE, "SFTP connection failed");
+                        }
+                    } catch (JSchException e) {
+                        logger.log(Level.SEVERE, "SFTP connection failed", e);
+                    }
                     break;
                 case StationSettings.MessageMethod.WORDPRESS:
                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");