Click here to Skip to main content
15,861,125 members
Articles / Productivity Apps and Services / Team Communication Tools / Skype

Enhanced Skype Chatter Robot

Rate me:
Please Sign up or sign in to vote.
5.00/5 (11 votes)
4 Aug 2013CPOL2 min read 83.8K   5.8K   28   32
An Enhanced Skype Chatter Bot, with a friendly user interface, programable knowledge base, testing interface with Export/Import knowledge base to files
Sample Image

Introduction

This piece of software enables the user to have a programmable ChatBot. Where most of the tutorials circulating on the internet have their knowledge base hard coded (obviously for demonstration purposes), here we will see that it is possible to add and edit rules to knowledge base during runtime, and the database is automatically saved to a file on storage.

Second thing that this program does is it doesn't simply compare strings to search for answers, but it uses a different strategy to calculate resemblance between strings, and this sort of overcomes typing errors, misspelled words, or inverted phrases.

In addition to the features mentioned above, it has several secondary features that enhance user experience like a testing section, message delaying, greeting message, and the ability to load and backup database into files.

Background

Originally, this was an application that I made previously for someone who had nothing to do with any programing. I found many examples that do illustrate how it should be basically done, but for my end-users, several things needed to be enhanced like:

  • User friendly interface
  • An editable knowledge base via the GUI
  • A way to overcome typing errors, misspelled words, etc.
  • Message delaying

I have based my work on this CodeProject article, Make your Skype Bot in .NET, as it was a nice 'scratch the surface' with the Skype4COM COM wrapper, and it's highly suggested to check it out as it contains a lot of definitions that will not be covered in this article.

Code Explanation

String Comparison Strategy and Message Processing

It is obvious that normal string comparison will only match strings character by character, which is not very effective when dealing with messages that were input by humans. In the case like we have here, strings are commonly compared by Resemblance. i.e., we will have to calculate the rate of how much do a pair of strings look alike. There are many algorithms and approaches to do such a comparison, for the sake of this project we will be using the Levenshtein distance.

Message processing is summarized in the following diagram :

Image 2

Source code preview of the actual method for message processing is as follows:

C#
// this method is the core of our message processing
private string ProcessCommand(string msg,bool showSimilarity)
{
	// remove all special characters, punctuation etc ...
	msg = preTreatMessage(msg);

	// we build our answer search query
	string answer="";
	string searchQuery = "";

	// we tokenize the given message
	string[] tokens = msg.Split(' ');
	string oper = "";
	// we search for all rules with the 'receive' that looks like the given message
	foreach (string token in tokens)
	{
		if (token != "")
		{
			searchQuery += oper + " receive LIKE '%" + token + "%' ";
			oper = "OR";
		}
	}
	// we store the results
	DataRow[] results = this.database.Rules.Select
	("active = True AND "+searchQuery);
	// set the minimum wordsMatching score (precision) 
	// messages that are matched below this threshold will be ignored
	double maxScore = this.intelligence;
	List<string> answerlist =new List<string>();
	// we calculate the matching score foreach rule and store the ones
	// with the highest score in the answerlist array
	foreach (DataRow result in results)
	{
		MatchsMaker m = new MatchsMaker(msg, result["receive"].ToString());
		if (m.Score > maxScore)
		{
			answerlist.Clear();
			answerlist.Add(result["send"] + ((showSimilarity)?" 
			(" + m.Score + ")":""));
			this.messageDelay = (int)result["delay"];
			maxScore = m.Score;
		}
		else if (m.Score == maxScore)
		{
			answerlist.Add(result["send"] + 
			((showSimilarity)?" (" + m.Score + ")":""));
			this.messageDelay = (int)result["delay"];
		}
	}
	if (answerlist.Count == 0) // if no rule was found (scored high)
	{
		// we give an empty message
		// OR , you can modify this to be a default message
		// like : "I dont understand !"
		answer = "";
	}else{
		// if there are rules with the same score
		// we just choose a random one
		Random rand = new Random();
		answer = answerlist[rand.Next(0,answerlist.Count)];
	}
	return answer;
}

Message Delaying

This feature was required to make the bot more realistic, a delay amount is assigned to each rule; However it can be done differently for example, we can count the characters of the response in order to avoid setting the delay every time we add a new rule.

Another thing that is not covered is to make Skype show that we are currently typing a message, during the message delaying.

Here is a preview of the method (Thread) for delaying the message, its simply sleeps for the amount of seconds set by the message.

C#
private void SendSkypeMessage(string username, string message)
{
	// the message is not empty
	if (message != "")
	{
		// pause the thread delay the message so it appears as if the bot types the message
		System.Threading.Thread.Sleep(1000*this.messageDelay);
		try
		{
			// send the actual message
			skype.SendMessage(username, message);
		}
		catch { }
	}
}

It is called within the skype_MessageStatus callback method:

C#
// create a thread to send the message with its delay
System.Threading.Thread t = new System.Threading.Thread(() => 
	SendSkypeMessage(msg.Sender.Handle, send));
t.Start();

History

  • August 2013: Released

Related Material

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Smart Solutions Médéa
Algeria Algeria
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Questionnot working - skype 5 cant be used anymore Pin
Member 1341408317-Sep-17 4:04
Member 1341408317-Sep-17 4:04 
AnswerRe: not working - skype 5 cant be used anymore Pin
OriginalGriff17-Sep-17 4:08
mveOriginalGriff17-Sep-17 4:08 
Questiondoes this work for Skype for business ? Pin
Member 126774589-Aug-16 3:09
Member 126774589-Aug-16 3:09 
QuestionDoes it have connector or it just connects to Skype only ? Pin
Member 99872102-Jun-16 16:34
Member 99872102-Jun-16 16:34 
QuestionHow to use it with skype version 7.22 (please provide step by step document for setup) Pin
Member 1056121326-Apr-16 5:54
Member 1056121326-Apr-16 5:54 
AnswerRe: How to use it with skype version 7.22 (please provide step by step document for setup) Pin
Member 1341408317-Sep-17 8:34
Member 1341408317-Sep-17 8:34 
PraiseNice Pin
Ehsan Sajjad23-Feb-16 10:46
professionalEhsan Sajjad23-Feb-16 10:46 
QuestionNot working Pin
helloyoud8-Sep-15 23:02
helloyoud8-Sep-15 23:02 
QuestionError loading DLL Pin
Member 1122448030-Jul-15 16:46
Member 1122448030-Jul-15 16:46 
Questionskype: telesyssoftsolution Pin
Member 117367462-Jun-15 10:25
Member 117367462-Jun-15 10:25 
Dear,

I want to discuss something related to your skype project. Please add me in skype. My skype ID is "telesyssoftsolution".

Waiting for your quick reply.

Thanks
Regards
Gopal Tripathi
Questionhelp? Pin
Member 1098146030-Jul-14 7:01
Member 1098146030-Jul-14 7:01 
AnswerRe: help? Pin
Member 1098146030-Jul-14 7:03
Member 1098146030-Jul-14 7:03 
GeneralRe: help? Pin
Member 1136625610-Jan-15 20:02
Member 1136625610-Jan-15 20:02 
GeneralRe: help? Pin
Osman Kalache11-Jan-15 1:32
Osman Kalache11-Jan-15 1:32 
GeneralVERSION Pin
nickjedl16-Jun-14 4:21
nickjedl16-Jun-14 4:21 
QuestionNice if it worked Pin
nickjedl16-Jun-14 4:03
nickjedl16-Jun-14 4:03 
AnswerRe: Nice if it worked Pin
Osman Kalache16-Jun-14 4:06
Osman Kalache16-Jun-14 4:06 
GeneralRe: Nice if it worked Pin
nickjedl16-Jun-14 4:07
nickjedl16-Jun-14 4:07 
GeneralRe: Nice if it worked Pin
Osman Kalache16-Jun-14 4:09
Osman Kalache16-Jun-14 4:09 
GeneralRe: Nice if it worked Pin
Member 111999832-Nov-14 4:44
Member 111999832-Nov-14 4:44 
GeneralRe: Nice if it worked Pin
Osman Kalache2-Nov-14 4:46
Osman Kalache2-Nov-14 4:46 
Questionehhhh Pin
Member 1087894112-Jun-14 10:18
Member 1087894112-Jun-14 10:18 
QuestionHow do you start it? Pin
Member 1078718430-Apr-14 19:37
Member 1078718430-Apr-14 19:37 
BugPost 5.3.0.116 Pin
Octal Ventures6-Apr-14 12:37
professionalOctal Ventures6-Apr-14 12:37 
QuestionHow to trigger it Pin
Member 1070624028-Mar-14 0:34
Member 1070624028-Mar-14 0:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.