2010-12-14 4 views
1

그래서 메신저 SDK를 활용하는 CMS 시스템을 만들려고 노력하고 있습니다. 아이디어는 자기 도움 로봇이 특정 문제를 통해 고객을 안내 할 수있게하는 것입니다. 대화는 두 가지 방법으로 실행됩니다. 일반 응답으로 응답하는 스크립트가 있습니다. 클라이언트가받은 각 메시지에서 프로그램은 XML 파일에서 응답을 트리거하는 certan 키워드와 질문을 찾습니다. 복용량을 찾으면 스크립트로 계속 진행합니다. 프로그램은 작동하지만 비용은 들지 않습니다. 그것의 거대한 자원 돼지. 이 프로그램에는 로그인, 로그 아웃, 메시지 수신 및 수신과 같은 모든 메신저 기능을 처리하는 클래스가 있습니다. 나는 또한 대화라고 부르는 수업도 있습니다. 이것은 메시지가 어디서 왔는지, 누구에게 갈 것인지, 스크립트로 작성된 대화에서 어떤 위치에 있었는지를 유지합니다. 내 주요 프로그램에서 나는 얼마나 많은 다른 사이트들이 내가 사용하고있는 어트랙션을 도와 주는지에 따라 클라이언트 클래스의 X 양을 초기화한다. 메시지를 수신 할 때마다 새로운 대화 클래스가 만들어 지거나 존재하는 대화를 확인하고 스크립트 된 위치를 찾습니다. 분명히 들어오는 메시지의 키워드에 대한 모든 검사도 수행합니다. 이 메시지를 수신하기위한 공유 이벤트 처리기 코드입니다. 제 질문은, 이걸 더 효율적으로 만들 수있게하기 위해서입니다.리소스 및 효율성

Private Sub yahooclients_OnRec(ByVal sender As Object, ByVal buddy As String, ByVal message As String) 
    TotalRec = TotalRec + 1 

    Try 


     Dim c As YahooClient = CType(sender, YahooClient) 'Yahoo Client To Send Message From 
     showLog("From:" & buddy & " To:" & c.Account & " Message:" & message) 
     Dim msgSplit As String() 
     Dim retmsg As String 
     Dim smsg As String() 
     Dim n1 As XmlNode 
     Dim sran As New Random 'Random SPlit Message 
     Dim domran As New Random 'Random Domain ID 
     Dim Found1 As Boolean = False 
     Dim FoundIt As Integer = 0 
     Dim i As Integer = 0 'Keyword Counter 
     'Check Message For KeyWords By Splitting Each phrase by spaces 
     msgSplit = Split(message, " ") 
     For Each word In msgSplit 
      For Each value In KeywordInd 
       If value = word Then 
        n1 = m_nodelist.Item(i) 
        retmsg = n1.InnerText 
        GoTo ScrubMessage 
       End If 
       i = i + 1 
      Next 
      i = 0 
     Next 

     'Check For Conversations 
     If convos.Count = 0 Then 
      convos.Add(New Conversation(c.Account, buddy, 0)) 
      retmsg = Script(0) 
      GoTo ScrubMessage 
     Else 
      For A As Integer = 0 To (convos.Count - 1) 
       If InStr(convos(A).TUser, c.Account) > 0 And InStr(convos(A).FUser, buddy) > 0 Then 
        Found1 = True 
        Exit For 
       End If 
       FoundIt = FoundIt + 1 
      Next 
      If Found1 = True Then 
       convos(FoundIt).SPosition = convos(FoundIt).SPosition + 1 
       'Send Next Position In Script 
       If convos(FoundIt).SPosition > (Script.Length - 1) Then 
        If convos(FoundIt).SPosition = Script.Length Then 
         TotalScript = TotalScript + 1 
         ToolStripStatusLabel10.Text = TotalScript 
        End If 
        Exit Sub 
       End If 
       retmsg = Script(convos(FoundIt).SPosition) 
       GoTo ScrubMessage 
      Else 
       convos.Add(New Conversation(c.Account, buddy, 0)) 
       retmsg = Script(0) 
       GoTo ScrubMessage 
      End If 
     End If 

ScrubMessage : '지구 밖으로 | SMSG = 분할 (retmsg, "|")

 'Pull A Random Response 
     If smsg.Length > 1 Then 
      retmsg = smsg(sran.Next(0, (smsg.Length) - 1)) 
     Else 
      retmsg = smsg(0) 
     End If 


     'Check For Domain Indicator 
     If InStr(retmsg, "%") > 0 Then 
      TotalLink = TotalLink + 1 
     End If 
     retmsg = Replace(retmsg, "%s", Domains(domran.Next(0, (Domains.Length - 1)))) 

     If CheckBox2.Checked = True Then 'send Message With Font and Color 
      retmsg = "<font face=" & """" & fname & """" & ">" & "[#FF80C0m" & retmsg & "</font>" 
     End If 


     showLog(("Sending Message: " & retmsg & " To: " & buddy & " From: " & c.Account)) 
     c.SendMessage(buddy, retmsg) 
     TotalSent = TotalSent + 1 
     ToolStripStatusLabel4.Text = TotalSent 'Updates Sent Counter 
     ToolStripStatusLabel6.Text = TotalRec 'Updates Rec Counter 
     ToolStripStatusLabel8.Text = TotalLink 'Updates Links counter 

    Catch ex As Exception 
     showLog(ex.ToString) 
    End Try 

End Sub 

이 프로그램은 정말 계정 많이 아무 resonsive 등 질문을하지 않습니다이된다

시작하기에 좋은 장소처럼 보이는 몇 가지가 있습니다

답변

0

.

1) ScrubMessage 뒤에 코드를 가져 와서 필요한 정보를 매개 변수로 사용하는 자체 함수로 가져옵니다. 그런 다음 모든 GoTos를 통화로 바꿉니다. 이것은 아마도 성능을 향상시키지 않을 것이지만, 대부분의 사람들이 코드를 더 쉽게 이해할 수있게 해줍니다 (그리고 관례에 따르면 생생물은 악합니다).

Sub ScrubAndSendMessage(response As String, client As YahooClient) 
    'code after label here with needed local variables 
End Sub 

2) 들어오는 모든 메시지의 단어마다 목록을 검색합니다. 내가 코드를 단순화하기 위해 사전을 사용하는 것이 좋습니다 잠재적 것, 키워드 목록 값의 노드 목록으로 열쇠가 될 것으로 보인다 때문에

Dim KeywordInd As List(Of String) 
Dim m_nodelist As List(Of XmlNode) 'or whatever type has the inner text 

: 사용을 기반으로, KeywordInd 및 m_nodelist은 아마 이런 식으로 뭔가를 선언 속도를 향상시킵니다. 키가 KeywordInd에서 단어와 값은

Dim wordResponse As New Dictionary(Of String, String) 

있는 당신은 말할 InnerText 수 있습니다 m_nodelist에서

For Each word In msgSplit 
    If wordResponse.ContainsKey(word) Then 
     ScrubMessage(wordResponse(word)) 
     Exit Sub 
    End If 
Next 

3) 당신이하지 않아도되도록 YahooClient 객체와 직접 대화를 연결 시도 대화를 찾을 때마다 조회를 수행합니다. 그렇게 할 때 원하는 경우 모든 클라이언트와 연결된 Conversation이 있는지 확인할 수도 있습니다.

4) 핸들러에서 UI 구성 요소로 보이는 것과 직접 상호 작용하고 있습니다. 이를 위해서는 모든 클라이언트의 모든 핸들러가 UI 스레드에서 실행되어야합니다. 이 핸들러에서 일부 이벤트를 발생시키고 양식에서 이벤트를 처리하고 필요에 따라 UI 스레드에 게시하는 것이 좋습니다. 이벤트는 아마도 ScriptPositionAdvancedResponseSent 또는 비슷한 것입니다.폼/컨트롤은 이러한 이벤트를 처리하고 UI 프레임 워크에서 선택한 패턴에 따라 UI 스레드에 게시 할 수 있습니다.이 UI 프레임 워크는 빠른 검색으로 찾을 수 있어야합니다.

+0

팁을 주셔서 대단히 감사합니다 !! –