2013-10-20 28 views
1

我已經閱讀了幾條不同的線索,介紹聊天客戶端如何處理垃圾郵件,但我仍然不知道處理此問題的哪條路徑會獲得最佳結果。聊天客戶端垃圾郵件過濾器返工和建議

我從這個帖子中看到:Chat spam auto block for C# chat client如果您使用DateTime中的時間戳並將它們與間隔進行比較,您可以製作一個相當不錯的垃圾郵件過濾器。然而,我不是一個專業的程序員,並且很難理解比較以前的DateTime郵票和計時器間隔的概念;或者我可能會忽略這一點。

考慮到這一點我已經涉足了一些C#代碼,想

所以建議用要麼只是計時器,日期印章,或兩者構造此想法的一個更好的辦法...

private void Post() 
    { 
     string time = DateTime.Now.ToString("HH:mm:ss"); 
     string data = UserInput.Text; 
     _GetData(time + " " + lUser + PROMPT + data); 
     ChatWindow.SetSelected(ChatWindow.Items.Count - 1, true); 
     ChatWindow.SetSelected(ChatWindow.Items.Count - 1, false); 
     UserInput.Clear(); 
    } 

    System.Timers.Timer resetTimer = new System.Timers.Timer(); 
    private int MessageCount { get; set; } 
    private bool isSpam { get; set; } 

    private void SpamEvent(object source, ElapsedEventArgs e) 
    { 
     if (MessageCount <= 2) 
     { 
      MessageCount -= 1; 
      isSpam = false; 
     } 
     else 
     { 
      isSpam = true; 
     } 
    } 

    private void ResetTimer(object source, ElapsedEventArgs e) 
    { 
     MessageCount = 0; 
     btnEnter.Enabled = true; 
    } 

    private void btnEnter_Click(object sender, EventArgs e) 
    { 
     MessageCount += 1; 
     System.Timers.Timer localtimer = new System.Timers.Timer(); 
     localtimer.Elapsed += new ElapsedEventHandler(SpamEvent); 
     localtimer.Interval = 1000; 
     localtimer.Enabled = true; 

     if (isSpam == false) 
     { 
      Post(); 
     } 
     if (isSpam == true) 
     { 
      MessageBox.Show("No spamming please"); 
      btnEnter.Enabled = false; 
      resetTimer.Interval = 5000; 
      resetTimer.SynchronizingObject = this; 
      resetTimer.Enabled = true; 
      resetTimer.Elapsed += new ElapsedEventHandler(ResetTimer); 
     } 
    } 

還是什麼像:

 List<DateTime> myMessage = new List<DateTime>(); 

     DateTime local = new DateTime(); 
     local = DateTime.Now; 
     myMessage.Add(local); 

     int Messages = myMessage.Count; 
     System.Timers.Timer localtimer = new System.Timers.Timer(); 

我目前在學校正在接受另一個滿負荷的班。工作之間,女朋友,班級和家庭責任之間的關係使我頭腦發熱。

+0

本地定時器僅作爲Post()方法執行時間的看門狗定時器服務器。因此,如果Post()的執行時間超過1秒,垃圾郵件將被標記。這不是你想要的,對吧? – elgonzo

+0

對,如果垃圾郵件方法爲假,我將稍後添加一些代碼以減少郵件計數。或者你認爲別的東西應該完全使用? – gh0st

+0

請參閱我的回答,瞭解您的代碼應實現的一般控制流程... – elgonzo

回答

0
  1. 使localTimer成爲該類的私人成員並將其重命名爲「spamTimer」或其他東西(nomen est omen)。

  2. 在您的btn_click方法中,首先檢查resetTimer是否已啓動並仍在運行(尚未過去)。如果是這樣,這意味着我們處於垃圾郵件處罰延遲。顯示MessageBox,但不做進一步處理。

  3. 檢查resetTimer後,檢查spamTimer是否已啓動。如果尚未啓動,請啓動它。但是,如果spamTimer已在運行(尚未過去)並且郵件計數大於2,請不要執行「發佈」,因爲檢測到垃圾郵件。相應地設置isSpam標誌並啓動重置計時器。顯示MessageBox,但不做進一步處理...

  4. 檢查spamTimer後,發佈消息。並且當然增加消息計數器...

  5. 當resetTimer過去時,重置isSpam標誌和messageCount。

+0

謝謝,我將在有更多時間的情況下進行示意圖...也請參見建議我不應該在客戶端級別管理整個垃圾郵件,因爲可以修改源代碼。你是否建議我將DateTime郵票發送到我的聊天服務器,然後以這種方式計算垃圾郵件?還是應該在本地客戶端上計算垃圾郵件,然後將結果發送到服務器? – gh0st

+0

在服務器上做所有事情。總是假設你的客戶正試圖破解你。所有用戶都會發送消息,然後您將該消息與用戶(基於會話或某事)相關聯,並計算消息被您接收到的時間戳。 –

+0

您還必須在服務器上進行垃圾郵件檢查。正如Micah所說,你不能相信來自客戶的任何信息。哎呀,有人可能只是編寫自己的假客戶端軟件來欺騙你的服務器。 – elgonzo

0

以下內容將使得用戶的消息在每分鐘發送超過10次時將被丟棄。這允許用戶只要總髮送不太多,就可以連續發送多個消息。從概念上講,任何時候來自用戶的消息到達聊天服務器時都會調用「ChatMessageReceived」。

class Message 
{ 
    public readonly String Author; 
    public readonly String Content; 
    public readonly DateTimeOffset Time = DateTimeOffset.UtcNow; 
    public Message(String author, String content) 
    { 
     Author = author; 
     Content = content; 
    } 
} 

class Chat 
{ 
    // collection of recent messages 
    private IList<Message> _recentMessages = new List<Message>(); 

    public void ChatMessageReceived(String author, String content) 
    { 
     // prune the recentMessages down to only messages in the last minute 
     var oneMinuteAgo = DateTimeOffset.UtcNow - TimeSpan.FromMinutes(1); 
     _recentMessages = (from message in _recentMessages where message.Time > oneMinuteAgo select message).ToList(); 

     // get the number of recent messages sent by this author 
     var countOfRecentMessagesFromAuthor = _recentMessages.Count(message => message.Author == author); 
     if (countOfRecentMessagesFromAuthor > 10) 
      return; 

     // add the new message to the collection of recent messages. 
     _recentMessages.Add(new Message(author, content)); 

     // Record the chat message and display it or send it to connected clients. 
    } 
} 
+0

因爲我現在真的沒有任何關於C#編程的書,而且我真的只是按照自己的步調來學習。我如何將你提供的代碼與我的代碼聯繫起來?不要誤解我的意思我認爲你創造了一些偉大的東西,只是我還沒有在那裏D: – gh0st