Class: Norn::SkillRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/norn/skill_registry.rb

Class Method Summary collapse

Class Method Details

.activate!(name) ⇒ Object

Mark a skill as activated



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/norn/skill_registry.rb', line 58

def activate!(name)
  skill = resolve(name)
  return false unless skill

  session = nil
  begin
    session = Norn["session"]
  rescue
  end

  if session
    names = session.get(:active_skills) || []
    unless names.include?(skill.name)
      session.set(:active_skills, names + [skill.name])
    end
  else
    @fallback_active_skills ||= []
    unless @fallback_active_skills.include?(skill)
      @fallback_active_skills << skill
    end
  end
  true
end

.active_skillsObject

Retrieves currently activated Norn::Skill objects in this session



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/norn/skill_registry.rb', line 42

def active_skills
  session = nil
  begin
    session = Norn["session"]
  rescue
  end

  if session
    names = session.get(:active_skills) || []
    names.map { |n| resolve(n) }.compact
  else
    @fallback_active_skills
  end
end

.check_and_activate!(text) ⇒ Object

Scans text and activates any matching skills based on their triggers (case-insensitive)



83
84
85
86
87
88
89
90
91
# File 'lib/norn/skill_registry.rb', line 83

def check_and_activate!(text)
  activated_any = false
  registered_skills.each do |skill|
    if skill.matches?(text)
      activated_any = true if activate!(skill.name)
    end
  end
  activated_any
end

.clear!Object



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/norn/skill_registry.rb', line 28

def clear!
  @lock.synchronize do
    @skills.clear
    @fallback_active_skills.clear
  end
  # Reset session storage if available
  begin
    session = Norn["session"]
    session.set(:active_skills, []) if session
  rescue
  end
end

.generate_catalog_xmlObject

Generates XML catalog for Tier 1 Progressive Disclosure



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/norn/skill_registry.rb', line 94

def generate_catalog_xml
  return "" if registered_skills.empty?

  xml = []
  xml << "<available_skills>"
  registered_skills.each do |skill|
    xml << "  <skill>"
    xml << "    <name>#{skill.name}</name>"
    xml << "    <description>#{skill.description}</description>"
    xml << "    <location>#{skill.location}</location>" if skill.location
    xml << "  </skill>"
  end
  xml << "</available_skills>"
  xml.join("\n")
end

.register(skill) ⇒ Object



10
11
12
13
14
# File 'lib/norn/skill_registry.rb', line 10

def register(skill)
  @lock.synchronize do
    @skills[skill.name.to_s.downcase] = skill
  end
end

.registered_skillsObject



22
23
24
25
26
# File 'lib/norn/skill_registry.rb', line 22

def registered_skills
  @lock.synchronize do
    @skills.values
  end
end

.resolve(name) ⇒ Object



16
17
18
19
20
# File 'lib/norn/skill_registry.rb', line 16

def resolve(name)
  @lock.synchronize do
    @skills[name.to_s.downcase]
  end
end