السلام عليكم ورحمة الله وبركاته
اليوم ان شاء الله تعالى نبدا بالبرمجة
وسوف نقوم بعمل صفحة الدردشة للزوار
نقوم بانشاء صفحتين الاول
live-support.aspx
والثانيه
live-conversation.aspx
في الصفحة الاولى live-support.aspx
نقوم بفحص حالة نظام الدردشة اذا كان لا يوجد موظف دعم فني متصل نقوم بكتابة رسالة له نخبره بها بعدم وجود موظف للدعم حاليا
وفي حالة وجود موظفين نقوم بجلب رقم جلسة الموظف الاون لاين والتي تحتوي اقل عدد من المحادثات تجري الان ونربط هذا العميل مع هذه الجلسة وذلك عن طريق انشاء سجل جديد خاص به نضع فيه رقم جلسة الموظف التي يتبع لها وكذلك نقوم بانشاء اسم مستخدم خاص فيه وباقي المعلومات في جلسة المحادثة ومن ثم نحولة للصفحة live-conversation.aspx حيث تحتوي الصفحة على ادوات المحادثة
عملنا اليوم سوف يكون في الصفحة
live-support.aspx
ننشىء الصفحة ونضع بها اداة ليبل واحده فقط سوف نستخدمها من اجل عرض رسالة عدم وجود موظفين دعم فني متصلين الان نسميها مثلا ErrorLabel
في كود الصفحة وتحديدا في حدث تحميل الصفحة حيث سوف يتواجد الكود الكامل
اولا نقوم بجلب ارقام موظفين الدعم الفني المتصلين حالياً ومعرفة اقل موظف لديه محادثات حالياً
كود:
'جلب اسم موظف الدعم الفني المتواجد حالياً والذي سيتم تحويل هذا الزبون له
'جلب الموظفين الاون لاين
Dim dsEmployeesSessions As New DataSet
SQLStr = "select ID,EmployeeID from EMall_LiveSupportEmployeesSessions where IsOnLine Like 'Y'"
Cmd.CommandText = SQLStr
Cmd.Connection = Con
Con.Open()
Adap.SelectCommand = Cmd
Adap.Fill(dsEmployeesSessions)
Con.Close()
If dsEmployeesSessions.Tables(0).Rows.Count = 0 Then
ErrorLabel.Text = "لايوجد موظفين دعم فني متصلين حاليا"
Exit Sub
End If
قمنا بجلب جميع موظفين الدعم الفني المتصلين حاليا وفي حالة لم يكن هناك نتائج عائده لنا في الداتا ست هذا يعني انه لا يوجد موظفين دعم فني اذا نقوم بكتابة رسالة عدم وجود موظفين ونخرجه من تنفيذ بقية الكود باستخدام Exit Sub
لاحظ ان جملة ال SQL اشترطنا بها ان تكون حالة الاتصال لجلسة الموظف IsOpen تساوي Y يعني اون لاين
الان نقوم بجلب جميع المحادثات في جدول المحادثات والتي تجري حاليا لكل الجلسات وما نريده هو عدد المحادثات لكل جلسة ومن ثم نختار الجلسة التي تحتوي اقل عدد من المحادثات ونربط هذا العميل بها
كود:
ViewState("EmployeesSessionsID") = dsEmployeesSessions.Tables(0).Rows(0)(0)
ViewState("EmployeeIDV") = dsEmployeesSessions.Tables(0).Rows(0)(1)
Dim IEm As Integer = Nothing
For IEm = dsEmployeesSessions.Tables(0).Rows.Count - 1 To 0 Step -1
'جلب عدد المحادثات التي يجريها هذا الموظف الان
Dim dsConvNumber As New DataSet
SQLStr = "select EMall_LiveSupportConversationsSessions.ID,EMall_LiveGuestSupportConversationsSessions.ID from EMall_LiveSupportConversationsSessions,EMall_LiveGuestSupportConversationsSessions where EMall_LiveSupportConversationsSessions.IsActive Like 'Y' and EMall_LiveGuestSupportConversationsSessions.IsActive Like 'Y' and EMall_LiveSupportConversationsSessions.EmployeeID=" & dsEmployeesSessions.Tables(0).Rows(IEm)(0) & " and EMall_LiveGuestSupportConversationsSessions.EmployeeID=" & dsEmployeesSessions.Tables(0).Rows(IEm)(0)
Cmd.CommandText = SQLStr
Cmd.Connection = Con
Con.Open()
Adap.SelectCommand = Cmd
Adap.Fill(dsConvNumber)
Con.Close()
ViewState("ConvNumber" & IEm) = dsConvNumber.Tables(0).Rows.Count
ViewState("EmployeesSessionsID" & IEm) = dsEmployeesSessions.Tables(0).Rows(IEm)(0)
ViewState("EmployeeIDV" & IEm) = dsEmployeesSessions.Tables(0).Rows(IEm)(1)
If ViewState("ConvNumber" & IEm) < ViewState("ConvNumber" & IEm - 1) Then
ViewState("EmployeesSessionsID") = dsEmployeesSessions.Tables(0).Rows(IEm)(0)
ViewState("EmployeeIDV") = dsEmployeesSessions.Tables(0).Rows(IEm)(1)
End If
Next
Dim EmployeesSessionsIDV As Long = ViewState("EmployeesSessionsID")
Dim EmployeeIDV As Long = ViewState("EmployeeIDV")
في البداية قمنا بتخزين رقم الجلسة الاولى ورقم الموظف الذي تتبع له الجلسة الاولى في متغيرات
كود:
ViewState("EmployeesSessionsID") = dsEmployeesSessions.Tables(0).Rows(0)(0)
ViewState("EmployeeIDV") = dsEmployeesSessions.Tables(0).Rows(0)(1)
ومن ثم نقوم بعمل حلقة تكراريه نجلب في كل مرة عدد المحادثات التي تتبع للجلسة التي تتبع لهذه الحقلة ونخزنها في داخل ViewState
وقد استخدمنا هنا ال ViewState لاننا لا نعلم تحديدا كم هو عدد الجلسات فاذا قمنا بتعريف متغير داخل الحلقة فانه في المرة القادمه التي سوف يدخل بها الحلقة سيتم حذف القيم الموجوده في المتغير للحلقة السابقة ومن ثم يسند لها قيم جديدة ونحن نريد ان نحتفظ بجميع القيم لجميع الحلقات لذلك استخدمنا ViewState بحيث يكون اسمها يتكون من كلمة يتبعها القيمة الموجوده في متغير الحلقة I وهكذا سوف نضمن انه لن يتكرر لنا نفس الاسم الموجود في ال ViewState مرتين اي اننا سوف نحصل على عدد من القيم المسنده داخل ViewState فلو كان لدينا 10 جلسات سوف نحصل على عشرة ViewState كل واحد لها اسم مختلف عن الاخر والاسماء منحصره بين القيمة الاولى للمتغير I الاولى وقيمة ال الاخيره للمتغير I
كما تلاحظ اننا في نهاية الحلقة كنا كل مرة نقارن ال ViewState للحلقة السابقة بال ViewState للحقة الجديدة فاذا كانت ال ViewState الجديدة اصغر من القديمه هذا يعني ان هذا الموظف عنده محادثات اقل من السابق فنسند رقم عضويته ورقم جلسته ل ViewState الجلسة ورقم العضوية الرئيسي
وهكذا بعد انتهاء الحلقة سوف نكون قد خرجنا بجلسة الموظف التي تحتوي اقل عدد من المحادثات
نقوم بافراغ رقم الجلسة ورقم موظف الدعم الفني في متغيرات
كود:
Dim EmployeesSessionsIDV As Long = ViewState("EmployeesSessionsID")
Dim EmployeeIDV As Long = ViewState("EmployeeIDV")
استخدم هنا نوع Long وليس Integer لان مع مرور الوقت قد يكون رقم الجلسات كبير جدا بحيث لا يستوعبه المتغير integer خصوصا في الدردشة حيث انشاء سجلات كثيره اذا كان المستخدمين كثر
الان نقوم بانشاء ملف المحادثة الخاص بجلسة المحادثة هذه هكذا
كود:
'انشاء ملف المحادثه
Dim rInt As Random = New Random
Dim RandomInt As String = rInt.Next(1, 1000000000).ToString
Dim FileName As String = RandomInt & "-" & Date.Now.ToString("mm-HH-dd-MM-yyyy") & ".htm"
'انشاء ملف ووضع فيه معلومات البطاقات
Dim FPath As String = dsPublicInfo.Tables(0).Rows(0)(1) & "livesupport" & "\" & FileName
Dim FilseSa As IO.FileStream = IO.File.Create(FPath)
FilseSa.Close()
لاحظ اننا عملنا اسم الملف باستخدام الوقت والتاريخ وقبلها رقم عشوائي وذلك لكي نضمن عدم تكرار الاسم مرتين ومن ثما قمنا بانشاء الملف من نوع html داخل المجلد livesupport في الموقع
مع العلم ان
dsPublicInfo.Tables(0).Rows(0)(1)
هذه هي مسار مجلد الموقع الرئيسي
الان نقوم بانشاء اسم المستخدم لهذا العميل
نقوم بجلب رقم اخر جلسة محادثة تمت ونكون اسم العميل هكذا (زائر 2) حيث ان 1 هي رقم اخر محادثة تمت فتكون محادثة هذا العميل هي المحادثة رقم 2 فيكون اسمه زائر 2
بالطريقة التالية
كود:
'جلب رقم اخر محادثة تمت في جدول محادثات الزوار
Dim dsLastConvInGTable As New DataSet
SQLStr = "select MAX(ID) from EMall_LiveGuestSupportConversationsSessions"
Cmd.CommandText = SQLStr
Cmd.Connection = Con
Con.Open()
Adap.SelectCommand = Cmd
Adap.Fill(dsLastConvInGTable)
Con.Close()
'انشاء اسم عشوائي للمستخدم
Dim GuestNameV As String = "زائر" & dsLastConvInGTable.Tables(0).Rows(0)(0)
الان نقوم بزرع معلومات جلسة المحادثة الجديدة في جدول جلسات المحادثة بعد ان اصبح لدينا اسم الزائر ورقم جلسة الموظف ورقم الموظف واسم ملف المحادثة ... وغيره من المعلومات المطلوبة
كود:
'زرع معلومات الجلسة الجديدة في قاعدة البيانات
SQLStr = "insert into EMall_LiveGuestSupportConversationsSessions(EmployeesSessionsID,EmployeeID,GuestName,StartSessionTime,EndSessionTime,ConversationFileName,IsActive) Values(" & EmployeesSessionsIDV & "," & EmployeeIDV & ",'" + GuestNameV + "','" + Date.Now.ToString("hh:mm:ss - dd/MM/yyyy") + "','0','" + FileName + "','Y')"
Cmd.CommandText = SQLStr
Cmd.Connection = Con
Con.Open()
Cmd.ExecuteNonQuery()
Con.Close()
بعد زرع سجل المحادثة نعود ونجلب رقم سجل المحادثة الذي تم زرعه قبل قليل لكي نحول المستخدم لصفحة المحادثة مع ارسال رقم المحادثة
ملاحظة : مع العلم ان رقم المحادثة موجود مسبقا وهو رقم الزائر او الرقم الموجود في اسم الزائر ولكن في حالة رغبتك بتسمية الزائر بطريقة اخرى نترك لك الخيار
نقوم بجلب رقم جلسة المحادثة
كود:
'جلب رقم الجلسة التي تم اضافتها الان
Dim dsSessionId As New DataSet
SQLStr = "select ID from EMall_LiveGuestSupportConversationsSessions where EmployeeID=" & EmployeeIDV & " and GuestName Like '" + GuestNameV + "' and ConversationFileName Like '" + FileName + "'"
Cmd.CommandText = SQLStr
Cmd.Connection = Con
Con.Open()
Adap.SelectCommand = Cmd
Adap.Fill(dsSessionId)
Con.Close()
Dim SessionIdV As Long = dsSessionId.Tables(0).Rows(0)(0)
قمنا بتخزين رقم الجلسة في متغير SessionIdV
اخيرا سوف نقوم بفتح ملف المحادثة ونزرع فيه كود Html
يتكون من جدول بسيط يحتوي تاريخ بداية هذه المحادثة ومن ثم نغلق الملف
كود:
'جلب المعلومات الموجوده في الملف
Dim HtmlPageCodeV As String = Nothing
Dim ExistCodeV As New IO.StreamReader(FPath)
HtmlPageCodeV = ExistCodeV.ReadToEnd()
ExistCodeV.Close()
'اضافة الكود على صفحة المحادثه
HtmlPageCodeV &= "<html'>"
HtmlPageCodeV &= "<head>"
HtmlPageCodeV &= "<META http-equiv='Content-Type' content='text/html; charset=UTF-8'>"
HtmlPageCodeV &= "</head>"
HtmlPageCodeV &= "<body>"
HtmlPageCodeV &= "<br>" & Date.Now.ToString("hh:mm:ss - dd/MM/yyyy")
HtmlPageCodeV &= "</body></html>"
'زرع معلومات المحادقه في بداية الملف
Dim ReadHtmlFileV As New IO.StreamWriter(FPath)
ReadHtmlFileV.Write(HtmlPageCodeV)
ReadHtmlFileV.Close()
اخيرا بعد الانتهاء وتجهيز متطلبات المحادثة نقوم بتحويل المستخدم لصفحة المحادثة الثانيه وهي live-conversation.aspx مع ارسال رقم المحادثة SessionIdV مع الرابط
كود:
'تحويل المستخدم لصفحة المحادثة مع رقم الجلسة
Response.Redirect("live-conversation.aspx?id=" & SessionIdV)
ملاحظة مهمه :- النظام حاليا يحتوي ثغره امنيه وهي ان اي متحدث يمكنه الاطلاع محادثات غيره والكتابة فيها
مثلا لو كانت جلسة العميل رقمها 24 في الرابط الالكتروني وجرب العميل وكتب 25 بدل 24 فسوف ينتقل ويدخل لمحادثة العميل الذي دخل النظام بعده ويستطيع الاطلاع والكتابة فيها
ولكي تتدارك هذه المشكلة ممكن نضيف على جلسة المحادثة حقل جديد وهو كود الجلسة
بحيث يكون هذا كود عشوائي نرسله مع رقم الجلسة وفي صفحة المحادثة نتحقق من ان الكود المرسل يتبع فعلا للجلسة المرسلة فاذا لم يكن يتبع لها نقوم باخراجه من الصفحة
وفي الوضع الحالي للنظام يمكن للعميل الاطلاع على المحادثات السابقة مثلا لو كان رقمه 24 وكتب في الرابط 3 فسوف يستعرض المحادثة التي رقمها 3 وهذا سوف نتداركه من خلال الصفحة الثانيه حيث سوف نمنع اي عميل من الاطلاع على محادثات منهيه يعني ارشيف المحادثات
بينما يبقى الحل الامثل هو بعمل كود للمحادثة يمنع دخول المستخدم لها الا اذا تحقق من ان الكود المرسل يتبع فعلا لرقم المحادثة المرسل
سوف اترك لكم مسألة الكود هذه كتمرين
وهي ليست صعبه بالطبع كل متطلباتها موجوده مسبقا في نفس الشرح سواء انشاء كود عشوائي او حقل جديد وغيره
ان شاء الله في الدرس القادم سوف ننتقل للصفحة الثانيه وهي صفحة اجراء الحوار