updates.
[silc.git] / apps / silc / local_command.c
index b32f07f4da9aa802ec673a0b4353bb20a5b11a6e..509b4fa2c52f89b35f26dab15d310aaa202cef3f 100644 (file)
@@ -33,6 +33,7 @@ SilcClientCommand silc_local_command_list[] =
   SILC_CLIENT_LCMD(away, AWAY, "AWAY", 0, 2),
   SILC_CLIENT_LCMD(key, KEY, "KEY", 0, 7),
   SILC_CLIENT_LCMD(me, ME, "ME", 0, 3),
+  SILC_CLIENT_LCMD(notice, NOTICE, "NOTICE", 0, 3),
 
   { NULL, 0, NULL, 0, 0 },
 };
@@ -89,7 +90,6 @@ SILC_CLIENT_LCMD_FUNC(version)
    private messages are not really commands, they are message packets,
    however, on user interface it is convenient to show them as commands
    as that is the common way of sending private messages (like in IRC). */
-/* XXX supports only one destination */
 
 SILC_CLIENT_LCMD_FUNC(msg)
 {
@@ -97,7 +97,7 @@ SILC_CLIENT_LCMD_FUNC(msg)
   SilcClientConnection conn = cmd->conn;
   SilcClient client = cmd->client;
   SilcClientEntry client_entry = NULL;
-  unsigned int num = 0;
+  uint32 num = 0;
   char *nickname = NULL, *server = NULL;
 
   if (!cmd->conn) {
@@ -217,6 +217,8 @@ SILC_CLIENT_LCMD_FUNC(away)
   SilcClientConnection conn = cmd->conn;
   SilcClient client = cmd->client;
   SilcClientInternal app = (SilcClientInternal)client->application;
+  unsigned char modebuf[4];
+  SilcBuffer idp, buffer;
 
   if (!cmd->conn) {
     silc_say(client, conn,
@@ -225,6 +227,8 @@ SILC_CLIENT_LCMD_FUNC(away)
   }
 
   if (cmd->argc == 1) {
+    conn->local_entry->mode &= ~SILC_UMODE_GONE;
+
     if (conn->away) {
       silc_free(conn->away->away);
       silc_free(conn->away);
@@ -235,7 +239,8 @@ SILC_CLIENT_LCMD_FUNC(away)
       silc_screen_print_bottom_line(app->screen, 0);
     }
   } else {
-
+    conn->local_entry->mode |= SILC_UMODE_GONE;
+  
     if (conn->away)
       silc_free(conn->away->away);
     else
@@ -248,6 +253,19 @@ SILC_CLIENT_LCMD_FUNC(away)
     silc_screen_print_bottom_line(app->screen, 0);
   }
 
+  /* Send the UMODE command to se myself as gone */
+  idp = silc_id_payload_encode(conn->local_id, SILC_ID_CLIENT);
+  SILC_PUT32_MSB(conn->local_entry->mode, modebuf);
+  buffer = silc_command_payload_encode_va(SILC_COMMAND_UMODE, 
+                                         ++conn->cmd_ident, 2, 
+                                         1, idp->data, idp->len, 
+                                         2, modebuf, sizeof(modebuf));
+  silc_client_packet_send(cmd->client, conn->sock, SILC_PACKET_COMMAND, 
+                         NULL, 0, NULL, NULL, buffer->data, 
+                         buffer->len, TRUE);
+  silc_buffer_free(buffer);
+  silc_buffer_free(idp);
+
  out:
   silc_client_command_free(cmd);
 }
@@ -283,13 +301,6 @@ static void keyagr_completion(SilcClient client,
             client_entry->nickname);;
 
     if (i->type == 1) {
-      if (!silc_client_ask_yes_no(client, 
-         "Would you like to use the key with private messages (y/n)? ")) {
-       silc_say(client, conn, "You can set the key material into use later by giving /KEY msg set command");
-       curr_key = key;
-       break;
-      }
-      
       /* Set the private key for this client */
       silc_client_del_private_message_key(client, conn, client_entry);
       silc_client_add_private_message_key_ske(client, conn, client_entry,
@@ -338,7 +349,7 @@ SILC_CLIENT_LCMD_FUNC(key)
   SilcClient client = cmd->client;
   SilcClientEntry client_entry = NULL;
   SilcChannelEntry channel_entry = NULL;
-  unsigned int num = 0;
+  uint32 num = 0;
   char *nickname = NULL, *server = NULL;
   int command = 0, port = 0, type = 0;
   char *hostname = NULL;
@@ -487,7 +498,7 @@ SILC_CLIENT_LCMD_FUNC(key)
     } else if (type == 2) {
       /* Unset channel key(s) */
       SilcChannelPrivateKey *keys;
-      unsigned int keys_count;
+      uint32 keys_count;
       int number;
 
       if (cmd->argc == 4)
@@ -521,7 +532,7 @@ SILC_CLIENT_LCMD_FUNC(key)
 
     if (type == 1) {
       SilcPrivateMessageKeys keys;
-      unsigned int keys_count;
+      uint32 keys_count;
       int k, i, len;
       char buf[1024];
 
@@ -596,7 +607,7 @@ SILC_CLIENT_LCMD_FUNC(key)
       silc_client_free_private_message_keys(keys, keys_count);
     } else if (type == 2) {
       SilcChannelPrivateKey *keys;
-      unsigned int keys_count;
+      uint32 keys_count;
       int k, i, len;
       char buf[1024];
 
@@ -741,3 +752,51 @@ SILC_CLIENT_LCMD_FUNC(me)
  out:
   silc_client_command_free(cmd);
 }
+
+/* Sends an notice to the channel.  */
+
+SILC_CLIENT_LCMD_FUNC(notice)
+{
+  SilcClientCommandContext cmd = (SilcClientCommandContext)context;
+  SilcClientConnection conn = cmd->conn;
+  SilcClient client = cmd->client;
+  SilcChannelEntry channel_entry;
+  char *name;
+
+  if (!cmd->conn) {
+    silc_say(client, conn,
+            "You are not connected to a server, use /SERVER to connect");
+    goto out;
+  }
+
+  if (cmd->argc < 3) {
+    silc_say(client, conn, "Usage: /NOTICE <channel> <message>");
+    goto out;
+  }
+
+  if (cmd->argv[1][0] == '*') {
+    if (!conn->current_channel) {
+      cmd->client->ops->say(cmd->client, conn, "You are not on any channel");
+      goto out;
+    }
+    name = conn->current_channel->channel_name;
+  } else {
+    name = cmd->argv[1];
+  }
+
+  channel_entry = silc_client_get_channel(client, conn, name);
+  if (!channel_entry) {
+    silc_say(client, conn, "You are not on that channel");
+    goto out;
+  }
+
+  /* Send the action message */
+  silc_client_send_channel_message(client, conn, channel_entry, NULL,
+                                  SILC_MESSAGE_FLAG_NOTICE, 
+                                  cmd->argv[2], cmd->argv_lens[2], TRUE);
+
+  silc_print(client, "- %s %s", conn->nickname, cmd->argv[2]);
+
+ out:
+  silc_client_command_free(cmd);
+}