int main(int argc, char **argv) { tic(); char *conf_file = NULL; socket_fd = -1; for (int i=1; i<argc; i++) { if (!strcmp(argv[i], "-c")) { if (argc <= i) { print_usage(); } conf_file = argv[++i]; } else if (!strcmp(argv[i], "-fd")) { if (argc <= i) { print_usage(); } socket_fd = atoi(argv[++i]); } else { printf(" >> unknown option: %s\n", argv[i]); } } if (!conf_file) conf_file = "cbot.conf"; load_config(conf_file); // Set rand seed srand(time(NULL)); // Set up cURL curl_global_init(CURL_GLOBAL_ALL); // Set up db connection for logging if (config->enabled_modules & MODULE_LOG) { log_init(); } // Parse markov corpus if (config->enabled_modules & MODULE_MARKOV) { markov_init(config->markovcorpus); } irc_init(); if (socket_fd == -1) { printf(" - Connecting to %s:%s with nick %s, joining channels...\n", config->host, config->port, config->nick); net_connect(); } else { // In-place upgrade yo printf(" >> Already connected, upgraded in-place!\n"); join_channels(); } struct recv_data *irc = malloc(sizeof(struct recv_data)); patterns = malloc(sizeof(*patterns)); compile_patterns(patterns); // Select param fd_set socket_set; FD_ZERO(&socket_set); FD_SET(STDIN_FILENO, &socket_set); FD_SET(socket_fd, &socket_set); int recv_size; char buffer[BUFFER_SIZE]; char input[BUFFER_SIZE]; memset(buffer, 0, BUFFER_SIZE); size_t buffer_length = 0; while (1) { int ret = select(socket_fd+1, &socket_set, 0, 0, 0); if (ret == -1) { printf(" >> Disconnected, reconnecting...\n"); close(socket_fd); net_connect(); } if (FD_ISSET(STDIN_FILENO, &socket_set)) { if (fgets(input, BUFFER_SIZE, stdin) == NULL) { printf(" >> Error while reading from stdin!\n"); continue; } if (strcmp(input, "quit\n") == 0) { printf(" >> Bye!\n"); break; } else if (strcmp(input, "reload\n") == 0) { terminate(); free(irc); free_patterns(patterns); free(patterns); // Set up arguments char * arguments[6]; arguments[0] = argv[0]; arguments[1] = "-c"; arguments[2] = conf_file; arguments[3] = "-fd"; char fdstring[snprintf(NULL, 0, "%d", socket_fd)]; sprintf(fdstring, "%d", socket_fd); arguments[4] = fdstring; arguments[5] = NULL; printf(" >> Upgrading...\n"); execvp(argv[0], arguments); printf(" !!! Execvp failing, giving up...\n"); exit(-1); } else if (strncmp(input, "say ", 4) == 0) { int offsets[30]; int offsetcount = pcre_exec(patterns->command_say, 0, input, strlen(input), 0, 0, offsets, 30); if (offsetcount > 0) { char channel[BUFFER_SIZE]; char message[BUFFER_SIZE]; pcre_copy_substring(input, offsets, offsetcount, 1, channel, BUFFER_SIZE); pcre_copy_substring(input, offsets, offsetcount, 2, message, BUFFER_SIZE); char sendbuf[strlen("PRIVMSG : ") + strlen(channel) + strlen(message)]; sprintf(sendbuf, "PRIVMSG %s :%s\n", channel, message); irc_send_str(sendbuf); } } else if (strncmp(input, "kick ", 5) == 0) { int offsets[30]; int offsetcount = pcre_exec(patterns->command_kick, 0, input, strlen(input), 0, 0, offsets, 30); if (offsetcount > 0) { char channel[BUFFER_SIZE]; char user[BUFFER_SIZE]; pcre_copy_substring(input, offsets, offsetcount, 1, channel, BUFFER_SIZE); pcre_copy_substring(input, offsets, offsetcount, 2, user, BUFFER_SIZE); char sendbuf[strlen("KICK :Gene police! You! Out of the pool, now!\n") + strlen(channel) + strlen(user)]; sprintf(sendbuf, "KICK %s %s :Gene police! You! Out of the pool, now!\n", channel, user); irc_send_str(sendbuf); } } else { printf(" >> Unrecognized command. Try 'quit'\n"); } FD_SET(socket_fd, &socket_set); } else { if (buffer_length >= BUFFER_SIZE - 1) { printf(" >> what the f**k, IRCd, a line longer than 4k? dropping some buffer\n"); memset(buffer, 0, BUFFER_SIZE); buffer_length = 0; continue; } recv_size = recv(socket_fd, buffer + buffer_length, BUFFER_SIZE - buffer_length - 1, 0); buffer_length += recv_size; buffer[buffer_length] = '\0'; if (recv_size == 0) { printf(" >> recv_size is 0, assuming closed remote socket, reconnecting\n"); close(socket_fd); printf("closed\n"); net_connect(); printf("reconnected\n"); } char *newlinepos = 0; char *bufbegin = buffer; while ((newlinepos = strchr(bufbegin, '\n'))) { *newlinepos = 0; printf(" ~ %s\n", bufbegin); // Only handle privmsg if (irc_parse_input(bufbegin, irc, patterns)) { irc_handle_input(irc, patterns); } bufbegin = newlinepos + 1; } size_t bytes_removed = bufbegin - buffer; memmove(buffer, bufbegin, buffer_length - bytes_removed); buffer_length -= bytes_removed; memset(buffer + buffer_length, 0, BUFFER_SIZE - buffer_length); FD_SET(STDIN_FILENO, &socket_set); } } printf(" >> Socket closed, quitting...\n"); close(socket_fd); free(irc); free_patterns(patterns); free(patterns); terminate(); return 0; }
int main(int argc, char **argv) { char *exeName = argv[0]; char *seqA; int lenA; int markovOrder = 0; char *markovFile = NULL; char *markovSaveFile = NULL; while (1) { int c = getopt(argc, argv, "m:f:s:h"); if (c==-1) break; switch (c) { case 'm': markovOrder = atoi(optarg); break; case 'f': markovFile = optarg; break; case 's': markovSaveFile = optarg; break; case 'h': default: usage(exeName); } } argc -= optind-1; argv += optind-1; if (argc != 2) { usage(exeName); } else { seqA = read_fasta(argv[1]); } lenA = strlen(seqA); printf("# Character prediction probability for FASTA file '%s'\n", argv[1]); printf("# Markov order = %d\n", markovOrder); printf("# Column order = [%s]\n", alphabet); { int i,j; unsigned char seqA_i[lenA]; DOUBLE seqA_enc[lenA][ALPHA_SIZE]; // Convert DNA sequence to only an A G C or T strict_DNA_seq(seqA, lenA); // First convert strings to numbers representing the characters for (i=0; i<lenA; i++) seqA_i[i] = char2int(seqA[i]); markov_init(ALPHA_SIZE, markovOrder); if (markovFile) markov_load(markovFile); else markov_fit(lenA, seqA_i); markov_predict(lenA, seqA_i, (DOUBLE*)seqA_enc); for (i=0; i<lenA; i++) { for (j=0; j<ALPHA_SIZE; j++) { printf("%f ", exp2(-seqA_enc[i][j])); } printf("\n"); } if (markovSaveFile) { FILE *f = fopen(markovSaveFile, "w"); if (!f) { fprintf(stderr, "Unable to open file '%s' for writing.\n", markovSaveFile); } else { fprintf(stderr, "Saving Markov Model parameters to file '%s'\n", markovSaveFile); markov_save(f); } } } return 0; }