Browse Source

Config input delay, timestamp format.

Steve Thielemann 3 years ago
parent
commit
cd144d38a9
6 changed files with 89 additions and 67 deletions
  1. 45 53
      input.cpp
  2. 1 0
      input.h
  3. 2 0
      irc.h
  4. 20 0
      main.cpp
  5. 18 14
      render.cpp
  6. 3 0
      render.h

+ 45 - 53
input.cpp

@@ -1,9 +1,10 @@
 #include "input.h"
+#include "render.h"
 
 bool allow_part = false;
 bool allow_join = false;
 
-const int ms_input_delay = 50;
+int ms_input_delay = 250;
 std::string input;
 std::string prompt; // mostly for length to erase/restore properly
 int max_input = 100;
@@ -49,13 +50,21 @@ future:
 
 void parse_input(door::Door &door, ircClient &irc) {
   // yes, we have something
+  std::time_t now_t;
+  time(&now_t);
+
   if (input[0] == '/') {
     // command given
     std::vector<std::string> cmd = split_limit(input, 3);
 
+    if (cmd[0] == "/motd") {
+      irc.write("MOTD");
+    }
+
     if (cmd[0] == "/quit") {
       irc.write("QUIT");
     }
+
     if (cmd[0] == "/talkto") {
       irc.talkto(cmd[1]);
       door << "[talkto = " << cmd[1] << "]" << door::nl;
@@ -75,14 +84,37 @@ void parse_input(door::Door &door, ircClient &irc) {
       }
     }
 
+    if (cmd[0] == "/msg") {
+      std::string tmp = "PRIVMSG " + cmd[1] + " :" + cmd[2];
+      irc.write(tmp);
+      stamp(now_t, door);
+      if (cmd[1][0] == '#') {
+        door << irc.nick << "/" << cmd[1] << " " << cmd[2] << door::nl;
+      } else {
+        door << cmd[1] << " " << cmd[2] << door::nl;
+      }
+    }
+
     if (cmd[0] == "/me") {
       cmd = split_limit(input, 2);
       std::string tmp =
           "PRIVMSG " + irc.talkto() + " :\x01" + "ACTION " + cmd[1] + "\x01";
       irc.write(tmp);
+      stamp(now_t, door);
       door << "* " << irc.nick << " " << cmd[1] << door::nl;
     }
 
+    if (cmd[0] == "/help") {
+      door << "IRC Commands :" << door::nl;
+      door << "/help /motd /quit" << door::nl;
+      door << "/me ACTION" << door::nl;
+      door << "/msg TARGET Message" << door::nl;
+      if (allow_part) {
+        door << "/join #CHANNEL" << door::nl;
+        door << "/part #CHANNEL" << door::nl;
+      }
+    }
+
     if (cmd[0] == "/info") {
       irc.channels_lock.lock();
       for (auto c : irc.channels) {
@@ -102,16 +134,16 @@ void parse_input(door::Door &door, ircClient &irc) {
     // where we've said it)
     door::ANSIColor nick_color{door::COLOR::WHITE, door::COLOR::BLUE};
 
+    stamp(now_t, door);
     if (target[0] == '#') {
       door::ANSIColor channel_color = door::ANSIColor{
           door::COLOR::YELLOW, door::COLOR::BLUE, door::ATTR::BOLD};
 
-      door << nick_color << irc.nick << door::ANSIColor(door::COLOR::CYAN)
-           << "/" << channel_color << target << door::reset << " " << input
-           << door::nl;
+      door << channel_color << target << nick_color << "/" << nick_color
+           << irc.nick << door::reset << " " << input << door::nl;
 
     } else {
-      door << nick_color << irc.nick << "/" << target << door::reset << " "
+      door << nick_color << irc.nick << " -> " << target << door::reset << " "
            << input << door::nl;
     }
     irc.write(output);
@@ -120,6 +152,8 @@ void parse_input(door::Door &door, ircClient &irc) {
   input.clear();
 }
 
+// can't do /motd it matches /me /msg
+
 const char *hot_keys[] = {"/join #", "/part #", "/talkto ", "/help", "/quit "};
 
 bool check_for_input(door::Door &door, ircClient &irc) {
@@ -130,8 +164,6 @@ bool check_for_input(door::Door &door, ircClient &irc) {
     // ok, nothing has been displayed at this time.
     if (door.haskey()) {
       // something to do.
-      prompt = "[" + irc.talkto() + "]";
-      door << prompt_color << prompt << input_color << " ";
       c = door.sleep_key(1);
       if (c < 0) {
         // handle timeout/hangup/out of time
@@ -140,6 +172,9 @@ bool check_for_input(door::Door &door, ircClient &irc) {
       if (c > 0x1000)
         return false;
       if (isprint(c)) {
+        prompt = "[" + irc.talkto() + "]";
+        door << prompt_color << prompt << input_color << " ";
+
         door << (char)c;
         input.append(1, c);
       }
@@ -159,6 +194,7 @@ bool check_for_input(door::Door &door, ircClient &irc) {
       if (c > 0x1000)
         return false;
       if (isprint(c)) {
+        // string length check / scroll support?
         door << (char)c;
         input.append(1, c);
         // hot-keys
@@ -183,40 +219,6 @@ bool check_for_input(door::Door &door, ircClient &irc) {
                 break;
               }
             }
-            /*
-          switch (input[1]) {
-          case 'j':
-          case 'J':
-            erase(door, input.size());
-            input = "/join ";
-            door << input;
-            break;
-          case 'p':
-          case 'P':
-            erase(door, input.size());
-            input = "/part ";
-            door << input;
-            break;
-          case 't':
-          case 'T':
-            erase(door, input.size());
-            input = "/talkto ";
-            door << input;
-            break;
-          case 'h':
-          case 'H':
-          case '?':
-            erase(door, input.size());
-            input = "/help";
-            door << input;
-            break;
-          case 'q':
-          case 'Q':
-            erase(door, input.size());
-            input = "/quit ";
-            door << input;
-          }
-          */
           }
         }
       }
@@ -225,15 +227,8 @@ bool check_for_input(door::Door &door, ircClient &irc) {
         if (input[0] == '/') {
           for (auto hk : hot_keys) {
             if (input == hk) {
-              /*
-   if ((input == "/help") or (input == "/talkto ") or
-       (input == "/join ") or (input == "/part ") or
-       (input == "/quit ")) { */
               clear_input(door);
-              /*
-                 erase(door, input.size());
-                 erase(door, prompt.size());
-              */
+
               input.clear();
               prompt.clear();
               return false;
@@ -256,11 +251,8 @@ bool check_for_input(door::Door &door, ircClient &irc) {
       if (c == 0x0d) {
         clear_input(door);
         prompt.clear();
-        /*
-        Should the input be handled/parsed here?
-
-         */
         parse_input(door, irc);
+        input.clear();
         return true;
       }
     }

+ 1 - 0
input.h

@@ -6,6 +6,7 @@
 
 extern bool allow_part;
 extern bool allow_join;
+extern int ms_input_delay;
 
 void clear_input(door::Door &d);
 void restore_input(door::Door &d);

+ 2 - 0
irc.h

@@ -16,6 +16,8 @@
 #include <fstream>
 #include <set>
 
+#include <boost/asio/io_context.hpp>
+
 void string_toupper(std::string &str);
 
 std::vector<std::string> split_limit(std::string &text, int max = -1);

+ 20 - 0
main.cpp

@@ -66,9 +66,25 @@ int main(int argc, char *argv[]) {
     update_config = true;
   }
 
+  if (!config["input_delay"]) {
+    config["input_delay"] = "500";
+    update_config = true;
+  }
+
+  if (!config["timestamp_format"]) {
+    config["timestamp_format"] = "%T";
+    update_config = true;
+  }
+
   if (update_config) {
     std::ofstream fout("irc-door.yaml");
+    fout << "# IRC Chat Door configuration" << std::endl;
+    fout << "# to add comments (that don't get destroyed)" << std::endl;
+    fout << "# Add comments as key: values, like:" << std::endl;
+    fout << "# _comment: This will survive the test of time." << std::endl;
+    fout << std::endl;
     fout << config << std::endl;
+    fout << "# end yaml config" << std::endl;
   }
 
   // configure
@@ -79,6 +95,10 @@ int main(int argc, char *argv[]) {
   irc.username = config["username"].as<std::string>();
   irc.autojoin = config["autojoin"].as<std::string>();
 
+  // set the delay between irc updates
+  ms_input_delay = config["input_delay"].as<int>();
+  timestamp_format = config["timestamp_format"].as<std::string>();
+
   if (config["log"]) {
     irc.debug_output = config["log"].as<std::string>();
     door << "irc debug logfile = " << config["log"].as<std::string>()

+ 18 - 14
render.cpp

@@ -2,8 +2,11 @@
 
 #include <iomanip>
 
-void stamp(message_stamp &msg_stamp, door::Door &door) {
-  door << std::put_time(std::localtime(&msg_stamp.stamp), "%T ");
+std::string timestamp_format = "%T";
+
+void stamp(std::time_t &stamp, door::Door &door) {
+  door << std::put_time(std::localtime(&stamp), timestamp_format.c_str())
+       << " ";
 }
 
 void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
@@ -12,7 +15,7 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
 
   if (irc_msg.size() == 1) {
     // system message
-    stamp(msg_stamp, door);
+    stamp(msg_stamp.stamp, door);
     door << "(" << irc_msg[0] << ")" << door::nl;
     return;
   }
@@ -23,7 +26,7 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
     std::string tmp = irc_msg[1];
     if (tmp[0] == ':')
       tmp.erase(0, 1);
-    stamp(msg_stamp, door);
+    stamp(msg_stamp.stamp, door);
     door << "* ERROR: " << tmp << door::nl;
   }
 
@@ -33,7 +36,7 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
     channel_topic[1].erase(0, 1);
     std::string output =
         "Topic for " + channel_topic[0] + " is: " + channel_topic[1];
-    stamp(msg_stamp, door);
+    stamp(msg_stamp.stamp, door);
     door << output << door::nl;
   }
 
@@ -42,7 +45,7 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
     std::string channel = split_limit(irc_msg[3], 2)[0];
 
     irc.channels_lock.lock();
-    stamp(msg_stamp, door);
+    stamp(msg_stamp.stamp, door);
     door << "* users on " << channel << " : ";
     for (auto name : irc.channels[channel]) {
       door << name << " ";
@@ -56,7 +59,7 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
     // MOTD
     std::string temp = irc_msg[3];
     temp.erase(0, 1);
-    stamp(msg_stamp, door);
+    stamp(msg_stamp.stamp, door);
     door << "* " << temp << door::nl;
   }
 
@@ -65,24 +68,24 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
     std::string tmp = irc_msg[3];
     if (tmp[0] == ':')
       tmp.erase(0, 1);
-    stamp(msg_stamp, door);
+    stamp(msg_stamp.stamp, door);
     door << "* " << tmp << door::nl;
   }
 
   if (cmd == "NOTICE") {
     std::string tmp = irc_msg[3];
     tmp.erase(0, 1);
-    stamp(msg_stamp, door);
+    stamp(msg_stamp.stamp, door);
     door << parse_nick(irc_msg[0]) << " NOTICE " << tmp << door::nl;
   }
 
   if (cmd == "ACTION") {
     if (irc_msg[2][0] == '#') {
-      stamp(msg_stamp, door);
+      stamp(msg_stamp.stamp, door);
       door << "* " << irc_msg[2] << "/" << parse_nick(irc_msg[0]) << " "
            << irc_msg[3] << door::nl;
     } else {
-      stamp(msg_stamp, door);
+      stamp(msg_stamp.stamp, door);
       door << "* " << parse_nick(irc_msg[0]) << " " << irc_msg[3] << door::nl;
     }
   }
@@ -90,7 +93,7 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
   if (cmd == "TOPIC") {
     std::string tmp = irc_msg[3];
     tmp.erase(0, 1);
-    stamp(msg_stamp, door);
+    stamp(msg_stamp.stamp, door);
     door << parse_nick(irc_msg[0]) << " set topic of " << irc_msg[2] << " to "
          << tmp << door::nl;
   }
@@ -106,13 +109,13 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
         channel_color = door::ANSIColor{door::COLOR::YELLOW, door::COLOR::BLUE,
                                         door::ATTR::BOLD};
       }
-      stamp(msg_stamp, door);
+      stamp(msg_stamp.stamp, door);
       door << channel_color << irc_msg[2] << "/" << nick_color
            << parse_nick(irc_msg[0]) << door::reset << " " << tmp << door::nl;
     } else {
       std::string tmp = irc_msg[3];
       tmp.erase(0, 1);
-      stamp(msg_stamp, door);
+      stamp(msg_stamp.stamp, door);
       door << nick_color << parse_nick(irc_msg[0]) << door::reset << " " << tmp
            << door::nl;
     }
@@ -121,6 +124,7 @@ void render(message_stamp &msg_stamp, door::Door &door, ircClient &irc) {
   if (cmd == "NICK") {
     std::string tmp = irc_msg[2];
     tmp.erase(0, 1);
+    stamp(msg_stamp.stamp, door);
     door << "* " << parse_nick(irc_msg[0]) << " is now known as " << tmp
          << door::nl;
   }

+ 3 - 0
render.h

@@ -6,6 +6,9 @@
 #include <string>
 #include <vector>
 
+extern std::string timestamp_format;
+
 void render(message_stamp &irc_msg, door::Door &door, ircClient &irc);
+void stamp(std::time_t &stamp, door::Door &door);
 
 #endif