]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/user.rb
Add a spam_score method to the user model
[rails.git] / app / models / user.rb
index 54b3fa371c4acc3674a0a303dea79d93a9ffa02b..a76d45710a51ed4500124f63b9958e058e4eca8c 100644 (file)
@@ -3,6 +3,7 @@ class User < ActiveRecord::Base
 
   has_many :traces, :conditions => { :visible => true }
   has_many :diary_entries, :order => 'created_at DESC'
+  has_many :diary_comments, :order => 'created_at DESC'
   has_many :messages, :foreign_key => :to_user_id, :conditions => { :to_user_visible => true }, :order => 'sent_on DESC'
   has_many :new_messages, :class_name => "Message", :foreign_key => :to_user_id, :conditions => { :to_user_visible => true, :message_read => false }, :order => 'sent_on DESC'
   has_many :sent_messages, :class_name => "Message", :foreign_key => :from_user_id, :conditions => { :from_user_visible => true }, :order => 'sent_on DESC'
@@ -24,8 +25,8 @@ class User < ActiveRecord::Base
   validates_uniqueness_of :email
   validates_length_of :pass_crypt, :within => 8..255
   validates_length_of :display_name, :within => 3..255, :allow_nil => true
-  validates_length_of :email, :within => 6..255
-  validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
+  validates_email_format_of :email
+  validates_email_format_of :new_email, :allow_blank => true
   validates_format_of :display_name, :with => /^[^\/;.,?]*$/
   validates_numericality_of :home_lat, :allow_nil => true
   validates_numericality_of :home_lon, :allow_nil => true
@@ -85,7 +86,7 @@ class User < ActiveRecord::Base
   end
 
   def languages
-    attribute_present?(:languages) ? read_attribute(:languages).split(",") : []
+    attribute_present?(:languages) ? read_attribute(:languages).split(/ *, */) : []
   end
 
   def languages=(languages)
@@ -166,4 +167,20 @@ class User < ActiveRecord::Base
     self.save
   end
 
+  ##
+  # return a spam score for a user
+  def spam_score
+    changeset_score = self.changesets.find(:all, :limit => 10).length * 50
+    trace_score = self.traces.find(:all, :limit => 10).length * 50
+    diary_entry_score = self.diary_entries.inject(0) { |s,e| s += OSM.spam_score(e.body) }
+    diary_comment_score = self.diary_comments.inject(0) { |s,e| s += OSM.spam_score(e.body) }
+
+    score = 0
+    score += diary_entry_score / self.diary_entries.length if self.diary_entries.length > 0
+    score += diary_comment_score / self.diary_comments.length if self.diary_comments.length > 0
+    score -= changeset_score
+    score -= trace_score
+
+    return score
+  end
 end