Dokumentation zum Massive Multiplayer Online Game - Universität ...
Dokumentation zum Massive Multiplayer Online Game - Universität ...
Dokumentation zum Massive Multiplayer Online Game - Universität ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
5. Spieler, Allianzen und Nachrichten<br />
61<br />
Implementierung<br />
Model<br />
Als erstes sollten die Beziehungen zwischen dem Sender, der Message und der (ggf. mehreren Empfängern)<br />
hergestellt werden.<br />
user.rb:<br />
has_many :messages_user<br />
has_many :messages, -> { select("`messages`.*, `messages_users`.`read` AS `read`,<br />
`messages_users`.`recipient_deleted` as `deleted`") },<br />
:through => :messages_user<br />
accepts_nested_attributes_for :messages_user<br />
has_many :sent_messages, :class_name => 'Message', :foreign_key => 'sender_id'<br />
message.rb:<br />
belongs_to :sender, :class_name => 'User', :foreign_key => 'sender_id'<br />
has_many :messages_users<br />
has_many :recipients, :class_name => 'User', :through => :messages_users, :source => :user<br />
messages_user.rb:<br />
belongs_to :message<br />
belongs_to :user<br />
Das Usermodel besitzt eine Hilfsmethode, mit welcher man die Anzahl der ungelesenen Nachrichten abrufen<br />
kann.<br />
def unread_messages<br />
count=0<br />
self.messages.each do |message|<br />
count+=1 unless message.read?<br />
end<br />
return count<br />
end<br />
Die Message besitzt zwei Hilfsmethoden:<br />
Damit der Spieler nicht auf Nachrichten zugreifen kann, die nicht von ihm selbst verfasst oder nicht an ihn<br />
gerichtet wurden, besitzt das Message Model folgende Methode, der zur Überprüfung ein User übergeben<br />
wird:<br />
def is_readable?(user)<br />
return false if user==nil<br />
return (user==self.sender or self.recipients.exists?(user)==1)<br />
end<br />
Sobald der Empfänger seine Nachricht gelesen/geöffnet hat, wird diese Relation in der messages_user Tabelle<br />
als "gelesen" markiert.<br />
def tag_msg_as_seen!(user)<br />
if(self.sender!=user)<br />
@entry=MessagesUser.all.where(:user_id=>user,:message_id=>self).first<br />
@entry.read=true<br />
@entry.save<br />
end<br />
end