C#, Asp.Net, .Net Core
Dotmsn Kütüphanesini Kullanarak Msn Botu Yapımı - C#.NET
Dotmsn Kütüphanesini Kullanarak Msn Botu Yapımı - C#.NET
-
Merhaba arkadaşlar;
Bugün vakit öldürmek için yaptığım bir uygulamayı sizlerle paylaşmak istiyorum.
Kodları verip, ahanda budur demek yerine. Satır satır anlatmaya çalışıcam neyi niçin yaptık diye. Gerçi pek anlatılacak bir şeyi yok :)
Evet ilk olarak dotmsn dll’ini projemize referans olarak ekliyoruz.
isteğe göre aşağıdaki gibi bir tasarım yapılabilir;
Dotmsn Kütüphanesi ve daha ayrıntılı bilgi için: http://www.xihsolutions.net/dotmsn/
Kaynak göstermeden paylaşmazsanız sevinirim. Konu hakkında soru veya önerilerinizi lütfen konuya cevap yazarak belirtiniz.
Herkese iyi çalışmalar
-
unutmadan son resimde, google translate alt yapısı kullanılarak çeviri yapan kodlar mevcut.
en sade haliyle kodları yazıyorum, tabi ki daha çok geliştirilebilir;
string adres = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + e.Message.Text + "&langpair=tr|en";
WebResponse gidenSoru; System.Net.WebRequest objRequest = System.Net.HttpWebRequest.Create(adres);
gidenSoru = objRequest.GetResponse();
StreamReader gelenCevap = new StreamReader(gidenSoru.GetResponseStream());
string gelen = gelenCevap.ReadToEnd();
int kelimedenSonrakiIndex = gelen.Substring(36).IndexOf('"');
sender.SendMessage(gelen.Substring(36).Substring(0, kelimedenSonrakiIndex)); -
hocam acces database bağlantısını nasıl yapabiliriz. yani kelimeleri accessden çeksin. gelen bi yazıya verilebilcek cevap 4 tane olsun. bunlara random değeri versek
örn: slm yazdı karşıdaki
1. tabloda aleyküm selam, 2.de merhaba vs vs gibi
databasede olmayan kelime için 5 farklı anlamadım yazısı olsa. bunlarıda dbden değiştirebilsek. bunlarda da random olsa.
bu tarz bişeyi nasıl yapabiliriz. zamanını alır mı_? -
anlamadığım yazınlara göre kendi kütüphanesini otomatikmen genişletebiliyormu? bişey yapmadan :D
-
sharp gerçekten eline saglık işime yaricak
-
lepusmorris bunu yazdı:
-----------------------------
hocam acces database bağlantısını nasıl yapabiliriz. yani kelimeleri accessden çeksin. gelen bi yazıya verilebilcek cevap 4 tane olsun. bunlara random değeri versek
örn: slm yazdı karşıdaki
1. tabloda aleyküm selam, 2.de merhaba vs vs gibi
databasede olmayan kelime için 5 farklı anlamadım yazısı olsa. bunlarıda dbden değiştirebilsek. bunlarda da random olsa.
bu tarz bişeyi nasıl yapabiliriz. zamanını alır mı_?
-----------------------------konuyu okurken db ile birleştirmeyi düşünüyordum, benim aklımda ki tasarım biraz daha farklı gelen mesaja cevap verirken 4 tane cevap sınırlaması koymadan bir tanede olabilir iki tanede de olabilir veya daha fazla sonra random olarak cevabı versin veya istenilen cevab ile yanıtlansın... :) yarın canım sıkılırsa yapmaya çalışırım :)
-
sağol dai işe yarar :)
-
lepusmorris bunu yazdı:
-----------------------------
hocam acces database bağlantısını nasıl yapabiliriz. yani kelimeleri accessden çeksin. gelen bi yazıya verilebilcek cevap 4 tane olsun. bunlara random değeri versek
örn: slm yazdı karşıdaki
1. tabloda aleyküm selam, 2.de merhaba vs vs gibi
databasede olmayan kelime için 5 farklı anlamadım yazısı olsa. bunlarıda dbden değiştirebilsek. bunlarda da random olsa.
bu tarz bişeyi nasıl yapabiliriz. zamanını alır mı_?
-----------------------------aslında bugün öyle bir şey de yazdım, biraz ayrıntıya girdim,madem ilgilenen var paylaşayım kısaca;
şimdi önce veritabanı tasarımından bi resim atayım
şimdi önce kişi ile daha önce konuşulmuş mu ona bakıyorum,
eğer konuşulmamışsa , kişinin onayını alıp ona göre veritabanına kaydediyorum. ilgili kodlar;
Kisiler konusulanKisi = datamodel.Kisiler.FirstOrDefault(p => p.KisiMail == konusulanKisininMailAdresi);
if (konusulanKisi == null)
{
if (e.Message.Text == "Hayır\0")
{
sender.SendMessage("Sizi Kaydetmeme İzin Vermediğiniz İçin Kaydetmedim.");
}
else if (e.Message.Text != "Evet")
{
verilecekCevap = "Merhaba, \n Sizi Daha Önce Hiç Görmedim, Benimle Konuşmak İçin Sizi Veritabanıma Kaydetmem Gerekiyor. Kabul Ediyorsanız 'Evet', Kabul Etmiyorsanız 'Hayır' Yazın.";
sender.SendMessage(verilecekCevap);
}
else
{
Kisiler yeniKisi = new Kisiler()
{
KisiMail = konusulanKisininMailAdresi,
Nick = e.Sender.Name,
Samimiyet = 1,
SonGorusme = DateTime.Now,
EklenmeTarihi = DateTime.Now,
};
datamodel.AddToKisiler(yeniKisi);
datamodel.SaveChanges();
sender.SendMessage("Sizi Kaydetmeme İzin Verdiğiniz İçin Teşekkürler (:, Artık Konuşmaya Hazırız (:");
}şimdi sırada ki adım; konuşma dağarcığını doldurmak. onunda kodu şöyle;
konusmaDagarcigi = (from d in datamodel.Konusmalar where d.GelenYazi.ToLower() == GelenYazi && d.Samimiyet == konusulanKisi.Samimiyet select d).ToList();
gelen yazı ve konuştuğum kişinin samimiyetine bağlı olarak verebileceğim cevapları bir list'e dolduruyorum. samimiyet kavramı nedir dersen şöyle;
ilk eklenen adamın samimiyeti 1'dir. 5 ay konuştuğun kişinin samimiyeti 8 dir.
samimiyeti 1 olan cevaplar ve samimiyeti 8 olan cevaplar var veritabanında.
Örnek; samimiyeti 1 olan adam sana "selam" yazarsa , bot "selam nasılsınız" yazar.
ama samimiyeti 8 olan adam sana "selam" yazarsa, bot "oo baba nerelerdesin ya ?" yazar.
şimdi bir sorunun birden çok cevabı olabilir. herkese ayrı ayrı yazsın dersen şöyle bir mantık kurulabilir. onunda kodu şöyle;
int dagarciktakiMesajAdedi = konusmaDagarcigi.Count;
int secilenIndex = randomNesnesi.Next(0, konusmaDagarcigi.Count - 1);
Konusmalar secilenCevap = konusmaDagarcigi.ElementAt(secilenIndex);
sender.SendMessage(secilenCevap.GonderilecekYazi);ee birde bot'un nelere cevap verip nelere cevap veremediğini bilmek istersin. onuda gelişmiş bir log katmanıyla öğrenebilirsin. mesela botun kelime dağarcığında hiç cevap yoksa
if (konusmaDagarcigi.Count == 0)
{
Ogrenilecekler kontrol = datamodel.Ogrenilecekler.FirstOrDefault(p => p.GelenYazi.ToLower() == GelenYazi);
if (kontrol != null)
{
verilecekCevap = "Yazdığınız Kelimeye Karşılık Bir Cevabım Yok Çünkü, Yazdığınız Kelime 'Öğrenilecekler' Bölümünde. Öğrenmemi Bekliyor (:";
konusmaLogu.GelenYazi = e.Message.Text;
konusmaLogu.GidenYazi = verilecekCevap;
if (konusulanKisi == null)
konusmaLogu.KonusulanKisiMail = konusulanKisininMailAdresi;
else
konusmaLogu.Kisiler = konusulanKisi;
fark = DateTime.Now - yazmaTarihi;
sender.SendMessage(verilecekCevap);
konusmaLogu.CevaplanmaSuresi = Convert.ToDecimal(fark.TotalSeconds);
konusmaLogu.Tarih = DateTime.Now;
datamodel.AddToKonusmaGecmisi(konusmaLogu);
datamodel.SaveChanges();
return;
}
Ogrenilecekler yeniBilgi = new Ogrenilecekler()
{
GelenYazi = GelenYazi,
OgrenildiMi = false,
Tarih = DateTime.Now
};
if (konusulanKisi == null)
yeniBilgi.GonderenMail = konusulanKisininMailAdresi;
else
yeniBilgi.Kisiler = konusulanKisi;
datamodel.AddToOgrenilecekler(yeniBilgi);
datamodel.SaveChanges();
verilecekCevap = "Korkarım Yazdığınız Şeyi Anlayamadım, Yazdığınız Şeyi Hafızam da 'Öğrenilecekler' Bölümüne Kaydettim. En Kısa Sürede Öğreneceğimden Emin Olabilirsiniz. Teşekkürler (:";
konusmaLogu.GelenYazi = e.Message.Text;
konusmaLogu.GidenYazi = verilecekCevap;
if (konusulanKisi == null)
konusmaLogu.KonusulanKisiMail = konusulanKisininMailAdresi;
else
konusmaLogu.Kisiler = konusulanKisi;
fark = DateTime.Now - yazmaTarihi;
sender.SendMessage(verilecekCevap);
konusmaLogu.CevaplanmaSuresi = Convert.ToDecimal(fark.TotalSeconds);
konusmaLogu.Tarih = DateTime.Now;
datamodel.AddToKonusmaGecmisi(konusmaLogu);
datamodel.SaveChanges();}
gibi yazılabilir. ben her şeyi logladığım için arada log katmanına giden kodlarda var. onlar kafanı karıştırmasın
iyi çalışmalar
-
CaNNi bunu yazdı:
-----------------------------
anlamadığım yazınlara göre kendi kütüphanesini otomatikmen genişletebiliyormu? bişey yapmadan :D
-----------------------------kendi kendine gelişmesi mümkün değil malesef, ama log katmanıyla kelime dağarcığını geliştirmek oldukça kolaylaşıyor. konuşma botu yapımı biraz amelelik gibi göründü şahsen bana, örneğin; her dakika browser'ı açıp ingilizce sözlük'e girmektense, direk msnden botuma yazıyorum çeviriyo. bu tip işlerde kullanılabilir.
-
:) bu adam bu işi biliyor, ögrenmeye de devam ediyor tebrikler basarili yolunda
-
Sitesinden dll'i ekleyip projeye referans ettiğimde Contact metodunun tipi void olduğundan kullanıcı adı gibi parametreleri almadı bende. Sana zahmet kullandığın dllyi bi yere upload edermisin ?