summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--testing/toxic/chat.c98
-rw-r--r--testing/toxic/main.c8
-rw-r--r--testing/toxic/prompt.c19
3 files changed, 97 insertions, 28 deletions
diff --git a/testing/toxic/chat.c b/testing/toxic/chat.c
index a90bb2aa..936eb868 100644
--- a/testing/toxic/chat.c
+++ b/testing/toxic/chat.c
@@ -26,6 +26,8 @@ typedef struct {
26} ChatContext; 26} ChatContext;
27 27
28extern void fix_name(uint8_t* name); 28extern void fix_name(uint8_t* name);
29void print_help(ChatContext* self);
30void execute(ToxWindow* self, ChatContext* ctx, char* cmd);
29 31
30static void chat_onMessage(ToxWindow* self, int num, uint8_t* msg, uint16_t len) { 32static void chat_onMessage(ToxWindow* self, int num, uint8_t* msg, uint16_t len) {
31 ChatContext* ctx = (ChatContext*) self->x; 33 ChatContext* ctx = (ChatContext*) self->x;
@@ -49,6 +51,7 @@ static void chat_onMessage(ToxWindow* self, int num, uint8_t* msg, uint16_t len)
49 51
50 wattron(ctx->history, COLOR_PAIR(2)); 52 wattron(ctx->history, COLOR_PAIR(2));
51 wprintw(ctx->history, "%02d:%02d:%02d ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); 53 wprintw(ctx->history, "%02d:%02d:%02d ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
54 wattroff(ctx->history, COLOR_PAIR(2));
52 wattron(ctx->history, COLOR_PAIR(4)); 55 wattron(ctx->history, COLOR_PAIR(4));
53 wprintw(ctx->history, "%s: ", nick); 56 wprintw(ctx->history, "%s: ", nick);
54 wattroff(ctx->history, COLOR_PAIR(4)); 57 wattroff(ctx->history, COLOR_PAIR(4));
@@ -97,41 +100,93 @@ static void chat_onKey(ToxWindow* self, int key) {
97 struct tm * timeinfo; 100 struct tm * timeinfo;
98 timeinfo = localtime(&now); 101 timeinfo = localtime(&now);
99 102
103 /* PRINTABLE characters: Add to line */
100 if(isprint(key)) { 104 if(isprint(key)) {
101
102 if(ctx->pos != sizeof(ctx->line)-1) { 105 if(ctx->pos != sizeof(ctx->line)-1) {
103 ctx->line[ctx->pos++] = key; 106 ctx->line[ctx->pos++] = key;
104 ctx->line[ctx->pos] = '\0'; 107 ctx->line[ctx->pos] = '\0';
105 } 108 }
106 } 109 }
107 110
111 /* RETURN key: Execute command or print line */
108 else if(key == '\n') { 112 else if(key == '\n') {
109 if(!string_is_empty(ctx->line)) { 113 if (ctx->line[0] == '/')
110 /* make sure the string has at least non-space character */ 114 execute(self, ctx, ctx->line);
111 wattron(ctx->history, COLOR_PAIR(2)); 115 else {
112 wprintw(ctx->history, "%02d:%02d:%02d ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); 116 if(!string_is_empty(ctx->line)) {
113 wattron(ctx->history, COLOR_PAIR(1)); 117 /* make sure the string has at least non-space character */
114 wprintw(ctx->history, "you: ", ctx->line); 118 wattron(ctx->history, COLOR_PAIR(2));
115 wattroff(ctx->history, COLOR_PAIR(1)); 119 wprintw(ctx->history, "%02d:%02d:%02d ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
116 wprintw(ctx->history, "%s\n", ctx->line); 120 wattroff(ctx->history, COLOR_PAIR(2));
117 121 wattron(ctx->history, COLOR_PAIR(1));
122 wprintw(ctx->history, "you: ", ctx->line);
123 wattroff(ctx->history, COLOR_PAIR(1));
124 wprintw(ctx->history, "%s\n", ctx->line);
125 }
118 if(m_sendmessage(ctx->friendnum, (uint8_t*) ctx->line, strlen(ctx->line)+1) < 0) { 126 if(m_sendmessage(ctx->friendnum, (uint8_t*) ctx->line, strlen(ctx->line)+1) < 0) {
119 wattron(ctx->history, COLOR_PAIR(3)); 127 wattron(ctx->history, COLOR_PAIR(3));
120 wprintw(ctx->history, " * Failed to send message.\n"); 128 wprintw(ctx->history, " * Failed to send message.\n");
121 wattroff(ctx->history, COLOR_PAIR(3)); 129 wattroff(ctx->history, COLOR_PAIR(3));
122 } 130 }
123
124 ctx->line[0] = '\0';
125 ctx->pos = 0;
126 } 131 }
132 ctx->line[0] = '\0';
133 ctx->pos = 0;
127 } 134 }
128 135
136 /* BACKSPACE key: Remove one character from line */
129 else if(key == 0x107 || key == 0x8 || key == 0x7f) { 137 else if(key == 0x107 || key == 0x8 || key == 0x7f) {
130 if(ctx->pos != 0) { 138 if(ctx->pos != 0) {
131 ctx->line[--ctx->pos] = '\0'; 139 ctx->line[--ctx->pos] = '\0';
132 } 140 }
133 } 141 }
142}
134 143
144void execute(ToxWindow* self, ChatContext* ctx, char* cmd)
145{
146 if (!strcmp(cmd, "/clear") || !strcmp(cmd, "/c")) {
147 wclear(self->window);
148 wclear(ctx->history);
149 }
150 else if (!strcmp(cmd, "/help") || !strcmp(cmd, "/h"))
151 print_help(ctx);
152 else if (!strcmp(cmd, "/quit") || !strcmp(cmd, "/exit") || !strcmp(cmd, "/q")) {
153 endwin();
154 exit(0);
155 }
156 else if (!strncmp(cmd, "/status ", strlen("/status "))) {
157 char* msg;
158 msg = strchr(cmd, ' ');
159 if(msg == NULL) {
160 wprintw(ctx->history, "Invalid syntax.\n");
161 return;
162 }
163 msg++;
164 m_set_userstatus((uint8_t*) msg, strlen(msg)+1);
165 wprintw(ctx->history, "Status set to: %s\n", msg);
166 }
167 else if (!strncmp(cmd, "/nick ", strlen("/nick "))) {
168 char* nick;
169 nick = strchr(cmd, ' ');
170 if(nick == NULL) {
171 wprintw(ctx->history, "Invalid syntax.\n");
172 return;
173 }
174 nick++;
175 setname((uint8_t*) nick, strlen(nick)+1);
176 wprintw(ctx->history, "Nickname set to: %s\n", nick);
177 }
178 else if(!strcmp(cmd, "/myid")) {
179 char id[32*2 + 1] = {0};
180 int i;
181 for (i = 0; i < 32; i++) {
182 char xx[3];
183 snprintf(xx, sizeof(xx), "%02x", self_public_key[i] & 0xff);
184 strcat(id, xx);
185 }
186 wprintw(ctx->history, "Your ID: %s\n", id);
187 }
188 else
189 wprintw(ctx->history, "Invalid command.\n");
135} 190}
136 191
137static void chat_onDraw(ToxWindow* self) { 192static void chat_onDraw(ToxWindow* self) {
@@ -164,6 +219,21 @@ static void chat_onInit(ToxWindow* self) {
164 ctx->linewin = subwin(self->window, 2, x, y - 3, 0); 219 ctx->linewin = subwin(self->window, 2, x, y - 3, 0);
165} 220}
166 221
222void print_help(ChatContext* self) {
223 wattron(self->history, COLOR_PAIR(2) | A_BOLD);
224 wprintw(self->history, "\nCommands:\n");
225 wattroff(self->history, A_BOLD);
226
227 wprintw(self->history, " /status <message> : Set your status\n");
228 wprintw(self->history, " /nick <nickname> : Set your nickname\n");
229 wprintw(self->history, " /myid : Print your ID\n");
230 wprintw(self->history, " /clear : Clear the screen\n");
231 wprintw(self->history, " /quit or /exit : Exit program\n");
232 wprintw(self->history, " /help : Print this message again\n\n");
233
234 wattroff(self->history, COLOR_PAIR(2));
235}
236
167ToxWindow new_chat(int friendnum) { 237ToxWindow new_chat(int friendnum) {
168 ToxWindow ret; 238 ToxWindow ret;
169 239
@@ -186,6 +256,6 @@ ToxWindow new_chat(int friendnum) {
186 x->friendnum = friendnum; 256 x->friendnum = friendnum;
187 257
188 ret.x = (void*) x; 258 ret.x = (void*) x;
189 259 free(x);
190 return ret; 260 return ret;
191} 261}
diff --git a/testing/toxic/main.c b/testing/toxic/main.c
index 3b45a89f..e0e23708 100644
--- a/testing/toxic/main.c
+++ b/testing/toxic/main.c
@@ -91,7 +91,7 @@ static void init_term() {
91 cbreak(); 91 cbreak();
92 keypad(stdscr, 1); 92 keypad(stdscr, 1);
93 noecho(); 93 noecho();
94 timeout(2000); 94 timeout(100);
95 95
96 if(has_colors()) { 96 if(has_colors()) {
97 start_color(); 97 start_color();
@@ -255,15 +255,15 @@ static void draw_bar() {
255 attron(A_BOLD); 255 attron(A_BOLD);
256 } 256 }
257 257
258 odd = (odd+1) % 2; 258 odd = (odd+1) % 10;
259 259
260 if(windows[i].blink && odd) { 260 if(windows[i].blink && (odd < 5)) {
261 attron(COLOR_PAIR(3)); 261 attron(COLOR_PAIR(3));
262 } 262 }
263 263
264 printw(" %s", windows[i].title); 264 printw(" %s", windows[i].title);
265 265
266 if(windows[i].blink && odd) { 266 if(windows[i].blink && (odd < 5)) {
267 attron(COLOR_PAIR(3)); 267 attron(COLOR_PAIR(3));
268 } 268 }
269 269
diff --git a/testing/toxic/prompt.c b/testing/toxic/prompt.c
index 1db60883..463b9352 100644
--- a/testing/toxic/prompt.c
+++ b/testing/toxic/prompt.c
@@ -89,7 +89,9 @@ static void execute(ToxWindow* self, char* cmd) {
89 } 89 }
90 90
91 dht.ip.i = resolved_address; 91 dht.ip.i = resolved_address;
92 DHT_bootstrap(dht, hex_string_to_bin(key)); 92 unsigned char *binary_string = hex_string_to_bin(key);
93 DHT_bootstrap(dht, binary_string);
94 free(binary_string);
93 } 95 }
94 else if(!strncmp(cmd, "add ", strlen("add "))) { 96 else if(!strncmp(cmd, "add ", strlen("add "))) {
95 uint8_t id_bin[32]; 97 uint8_t id_bin[32];
@@ -148,7 +150,7 @@ static void execute(ToxWindow* self, char* cmd) {
148 wprintw(self->window, "Friend request already sent.\n"); 150 wprintw(self->window, "Friend request already sent.\n");
149 break; 151 break;
150 case -5: 152 case -5:
151 wprintw(self->window, "[i] Undefined error when adding friend.\n"); 153 wprintw(self->window, "Undefined error when adding friend.\n");
152 break; 154 break;
153 default: 155 default:
154 wprintw(self->window, "Friend added as %d.\n", num); 156 wprintw(self->window, "Friend added as %d.\n", num);
@@ -178,12 +180,13 @@ static void execute(ToxWindow* self, char* cmd) {
178 180
179 nick = strchr(cmd, ' '); 181 nick = strchr(cmd, ' ');
180 if(nick == NULL) { 182 if(nick == NULL) {
183 wprintw(self->window, "Invalid syntax.\n");
181 return; 184 return;
182 } 185 }
183 nick++; 186 nick++;
184 187
185 setname((uint8_t*) nick, strlen(nick)+1); 188 setname((uint8_t*) nick, strlen(nick)+1);
186 wprintw(self->window, "Nickname set to: %s.\n", nick); 189 wprintw(self->window, "Nickname set to: %s\n", nick);
187 } 190 }
188 else if(!strcmp(cmd, "myid")) { 191 else if(!strcmp(cmd, "myid")) {
189 char id[32*2 + 1] = {0}; 192 char id[32*2 + 1] = {0};
@@ -195,7 +198,7 @@ static void execute(ToxWindow* self, char* cmd) {
195 strcat(id, xx); 198 strcat(id, xx);
196 } 199 }
197 200
198 wprintw(self->window, "%s\n", id); 201 wprintw(self->window, "Your ID: %s\n", id);
199 } 202 }
200 else if(!strncmp(cmd, "accept ", strlen("accept "))) { 203 else if(!strncmp(cmd, "accept ", strlen("accept "))) {
201 char* id; 204 char* id;
@@ -251,20 +254,18 @@ static void execute(ToxWindow* self, char* cmd) {
251 wprintw(self->window, "Message successfully sent.\n"); 254 wprintw(self->window, "Message successfully sent.\n");
252 } 255 }
253 } 256 }
257
254 else { 258 else {
255 wprintw(self->window, "Invalid syntax.\n"); 259 wprintw(self->window, "Invalid command.\n");
256 } 260 }
257} 261}
258 262
259static void prompt_onKey(ToxWindow* self, int key) { 263static void prompt_onKey(ToxWindow* self, int key) {
260
261 // PRINTABLE characters: Add to line. 264 // PRINTABLE characters: Add to line.
262 if(isprint(key)) { 265 if(isprint(key)) {
263
264 if(prompt_buf_pos == (sizeof(prompt_buf) - 1)) { 266 if(prompt_buf_pos == (sizeof(prompt_buf) - 1)) {
265 return; 267 return;
266 } 268 }
267
268 prompt_buf[prompt_buf_pos++] = key; 269 prompt_buf[prompt_buf_pos++] = key;
269 prompt_buf[prompt_buf_pos] = 0; 270 prompt_buf[prompt_buf_pos] = 0;
270 } 271 }
@@ -273,14 +274,12 @@ static void prompt_onKey(ToxWindow* self, int key) {
273 else if(key == '\n') { 274 else if(key == '\n') {
274 wprintw(self->window, "\n"); 275 wprintw(self->window, "\n");
275 execute(self, prompt_buf); 276 execute(self, prompt_buf);
276
277 prompt_buf_pos = 0; 277 prompt_buf_pos = 0;
278 prompt_buf[0] = 0; 278 prompt_buf[0] = 0;
279 } 279 }
280 280
281 // BACKSPACE key: Remove one character from line. 281 // BACKSPACE key: Remove one character from line.
282 else if(key == 0x107 || key == 0x8 || key == 0x7f) { 282 else if(key == 0x107 || key == 0x8 || key == 0x7f) {
283
284 if(prompt_buf_pos != 0) { 283 if(prompt_buf_pos != 0) {
285 prompt_buf[--prompt_buf_pos] = 0; 284 prompt_buf[--prompt_buf_pos] = 0;
286 } 285 }