# Chatbot, from Group D (and F) in Lab session 1
## You wanna look at the changelogs, look in the top right. 3 Dots, "Version and Github Sync".
### or not, considering that we have to zip this file up. Eh. Take a link to the hackmd too, if you want to keep using it. Recursion, huzzah.
Main code: https://hackmd.io/6BS1DdrOSWy2lWl0X6Wvnw?both
Wordlist: https://hackmd.io/3AVEajKpTaeDkzTHEimPog?both
``` c
//Libraries go here. Add as you need.
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
int main()
{
// Taking inspiration from line 6 of https://github.com/hashinclude72/chatbot/blob/master/chatbot.c
char questions[10][10]={"who","what","where","why","how"}; //Priority keywords. If one of these is at the start of the input, react accordingly.
char keywords1[100][20]={"zomgwtf","sky","blue","london","uk",};//Keyword bank that program will compare words in input to.
int questionLen = sizeof questions / sizeof questions[0];
int keywordsLen = sizeof keywords1 / sizeof keywords1[0]; //get len of both arrays
/*
Branching tree word bank example:
why
sky
blue:reasons
what
where
london:uk
Each word in sentence search current branch, if match then enter new branch
Don't know how to do this
*/
/*
Idea for reading tree word bank from file
Ignore first star
Read each word looking for match
After first star ignore stuff between stars
/end indicates branch has ended
If match found, start from that point so first star will be ignored, reading into
next branch and ending at /end
*
1a
*
2a
2b
2c
/end
*
1b
1c
*
2a
2b
/end
*
/end
*
*/
//Prints opening line and waits for a response.
printf("Hello- what is your name?: ");
char name[20];
fgets(name, sizeof(name), stdin); //Take user's name and store in array 'name'
//COPIED FROM greeting.c
//Takes time from user's clock, responds accordingly
int hour;
time_t t = time(NULL);
struct tm tm = *localtime(&t);
hour=tm.tm_hour;
//* https://stackoverflow.com/a/1442131 *//
if (hour<12)
{
printf("Good morning, %s",name);
}
else if (hour<19)
{
printf("Good afternoon, %s",name);
}
else
{
printf("Good evening, %s",name);
}
//COPIED FROM greeting.c
//FILE* wordbank = fopen("wordbank.txt", "r"); //file containing wordbank tree, not made yet
while (1) {
//take input
char input[100]; //Sentences can be long.
char* userQuestion;
char* userKeyword;
fgets(input, sizeof(input), stdin); //get user input
int len = strlen(input);
input[strcspn(input, "\n")] = 0; //removes trailing newline
int j=0;// for loop to remove puncuation
for(int i=0;i<len;i++){ //https://stackoverflow.com/a/1841811
if (! ispunct(input[i])){ //if its not punctuation, write it to the string
input[j]=tolower(input[i]);
j++;
}
}
//do something
//Goal- Split up inputted line into seperate strings, each made of a word and either whitespace or a special character, as sentences usually end. Or a null byte or something, if they decide to not punctuate.
//Then, parse each word through a function that checks if it recognises the word from a wordbank- once this is completed, try to respond with a relevant response.
//read word
char* word; //pointer to current word
const char space[2] = " "; //delimiter character
word = strtok(input, space); //get first word
while (word != NULL) { //while there are words left print and get next word
printf("Word: %s\n", word);
//TODO check word against wordbank.txt
//could probably compress this by making it into a function and calling it twice
//TODO make responses
for (int bank=0;bank<=questionLen;bank++) //finding question word in user input
if (strcmp(word, questions[bank])==0){ //compare word in user input against question word
userQuestion = questions[bank];
printf("Question: %s\n", userQuestion); //test print the found user question word
break; //break loop when question word found (could add functionality for multiple question words)
}
for (int i=0;i<=keywordsLen;i++) //as above but for the keyword
if (strcmp(word, keywords1[i])==0){ //needs integration with the parsed wordbank.txt
userKeyword = keywords1[i];
printf("Keyword: %s\n", userKeyword); //test print the found user question word
}
word = strtok(NULL, space);
}
}
//Idea- have the chatbot ask a question and add the answer to wordbank.txt
//Idea- use strstr() [or use strcasestr() which ignores case) that allows for finding substrings within string? Not sure how to use this with an array filled with keywords, but something to think about.
//If you use strcasestr(), put #define _GNU_SOURCE BEFORE ANY #include.
return 0;
}
//alex wuz 'ere- delete this comment at your own peril
//a second alex has also been here
```