Class: PanelsController

Inherits:
ApplicationController show all
Defined in:
app/controllers/panels_controller.rb

Overview

Gestion des panneaux

Ce contrôleur gère les panneaux (Panel). Il permet de :

  • Liste les panneaux

  • Enregistrer un nouveau panneau depuis SL

  • Mettre à jour un panneau depuis SL

  • Enregistrer le clic d’un avatar dans SL et lui envoyer URL ou Media URL

Instance Method Summary collapse

Instance Method Details

#avtouchObject

Un avatar clique sur le panel

Input

  • Environnement Second Life transmis en HTTP

  • avatar_key : Clé SL de l’avatar qui a cliqué

Output

  • Le serveur envoie 1 ou 2 mails à des containers pour qu’ils envoient à leur tour un landmark et/ou une notecard à l’avatar.



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'app/controllers/panels_controller.rb', line 120

def avtouch
  # Récupère le panel, l'avatar, la notecard, le landmark
  panel = Panel.find_by_panel_key(@slattrs[:key])
  if panel.nil?
    render :text => "The panel id '#{@slattrs[:key]}' does not exist.",
           :status => "409 Undefined panel '#{@slattrs[:key]}'",
           :layout => false,
           :content_type => "text/plain"
    return
  end
  if !(avatar_key = params[:avatar_key])
    render :text => "Missing avatar key.",
           :status => "409 Missing avatar key",
           :layout => false,
           :content_type => "text/plain"
    return
  end
  # Trouve les landmark et notecard associés, ou une valeur par défaut
  landmark = panel.landmark
  notecard = panel.notecard

  # On envoie successivement un mail pour landmark et un pour notecard,
  # mais uniquement s'il y a quelque chose à envoyer (!= nil).
  [ landmark, notecard ].each do |obj|
    Mailer.deliver_avtouch(obj.container.container_key,
                           avatar_key,
                           obj.name) if obj
  end
  # Fini
  render :text => "Objects sent.",
         :layout => false,
         :content_type => "text/plain"
end

#destroyObject

Si le panneau n’a pas donné signe de vie depuis 5 fois le délais prévu on le supprime de la base



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'app/controllers/panels_controller.rb', line 156

def destroy
  # On récupère le delay du furniture associé
  panel = Panel.find(params[:id])
  delay =   Furniture.find(panel.furniture.id).delay
  updated_time = panel.updated_at  + 5 * delay * 60
  # Si la date actuelle est > à date du updated_at + 5xdelay (également présent dans la vue)
  # 
  # on affiche le bouton de suppression
  if updated_time < Time::now
    # On sauve dans la table revision
    # save_to_revision_table
    panel.destroy
  end
  redirect_to :action => 'list'
end

#destroydeadObject

Détruit tous les panneaux qui n’ont pas contacté le serveur depuis 5 x le delay



174
175
176
177
178
179
180
181
182
183
# File 'app/controllers/panels_controller.rb', line 174

def destroydead
  for panel in Panel.find_all
    for column in Panel.content_columns 
      if (panel.updated_at  + 5 * Furniture.find(panel.furniture.id).delay * 60) < Time.now 
        panel.destroy
      end
    end
  end
  redirect_to :action => 'list'
end

#indexObject

Affiche l’index, par défaut la liste des panneaux



17
18
19
20
# File 'app/controllers/panels_controller.rb', line 17

def index
  list
  render :action => 'list'
end

#listObject

Liste des panneauxs disponibles



27
28
29
# File 'app/controllers/panels_controller.rb', line 27

def list
  @panel_pages, @panels = paginate :panels, :per_page => 10
end

#registerObject

Enregistrement d’un nouveau panneau

Input

  • Environnement Second Life transmis en HTTP

  • furniture_key

    Clé SL du mobilier possédant ce panneau

Output

  • Le délai de mise à jour, sous la forme :

delay=delay


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'app/controllers/panels_controller.rb', line 46

def register
  # Quel est le mobilier parent ?
  furniture_key = params[:furniture_key]
  furniture = Furniture.find_by_furniture_key(furniture_key)
  if furniture.nil?
    render :text => "The furniture id '#{furniture_key}' does not exist.",
           :status => "409 Undefined furniture '#{furniture_key}'",
           :layout => false,
           :content_type => "text/plain"
    return
  end
  # Création ou mise à jour du panneau
  panel = Panel.find_or_initialize_by_panel_key(@slattrs[:key])
  panel.furniture = furniture
  panel.update_attributes!(:name => @slattrs[:name])
  
  render :text => "delay=%#{furniture.delay}%",
         :layout => false,
         :content_type => "text/plain"
end

#showObject

Affiche le détail d’un panneau



32
33
34
# File 'app/controllers/panels_controller.rb', line 32

def show
  @panel = Panel.find(params[:id])
end

#updateObject

Mise à jour du panel

Input

  • Environnement Second Life transmis en HTTP

Output

  • Le délai de mise à jour, la texture, l’url, la media url sous la forme suivante avec un attribut par ligne :

delay=delay
texture=texture_key
url=url
mediaurl=mediaurl

Quand il n’y a pas d’URL ou de Media URL, le contenu envoyé est respectivement nourl ou nomedia.



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'app/controllers/panels_controller.rb', line 81

def update
  # Mise à jour du panel
  panel = Panel.find_by_panel_key(@slattrs[:key])
  if panel.nil?
    render :text => "The panel id '#{@slattrs[:key]}' does not exist.",
           :status => "409 Undefined panel '#{@slattrs[:key]}'",
           :layout => false,
           :content_type => "text/plain"
    return
  end
  # Trouve la texture associée
  texture = panel.texture.object_key
  # Trouve les URL et Media URL associées, ou une valeur par défaut
  url = if (obj = panel.url)
          obj.content
        else "nourl" end
  mediaurl = if (obj = panel.mediaurl)
               obj.content
             else "nomedia" end

  # Construit et envoie la réponse
  panel_response = [ ["delay", panel.furniture.delay], 
                     ["texture", texture], 
                     ["url", url], 
                     ["mediaurl", mediaurl] ].map { |pair| "#{pair[0]}=#{pair[1]}" }.join("\n")
  render :text => panel_response,
         :layout => false,
         :content_type => "text/plain"
end