<game>
<description>
Membrane currencies are used to establish circles by forming a context that names currencies and users, and then assigning users to roles (player_classes) in the circle's currencies.<br />
Player classes: self (represents the circle as a whole), member (users names in the circle), namer (the stewards responsible for adding users and currencies to the circle)<br />
Self Summary functions: Currencies--The list of currencies used by the circle<br />
Self Plays:
-- none yet --
Member Summary function: Permissions--The list of permissions a member has.<br />
Member Plays:
-- none yet --
Namer Summary Function: none
Namer Plays:
bind_currency(from,to,currency,name,meta) # adds a currency to the circle to be known as name.
unbind_currency(from,to,currency,name) # adds a currency to the circle to be known as name.
name_member(from,user,name) # names a new member player into the circle as for a user.
grant(from,to,currency,player_class) # adds a member of the circle to a currency as a given player_class.
revoke(from,to,currency,player_class)
</description>
<player_classes>
<player_class name="member" />
<player_class name="namer" />
<player_class name="self" />
</player_classes>
<states>
<state player_class="member"><hash name="permissions" /></state>
<state player_class="self"><hash name="currencies" /></state>
</states>
<plays>
<play name="_new_self">
<fields>
<field type="" id="class" />
</fields>
<script type="ruby">
<![CDATA[ @self_state.currencies = {};]]>
</script>
</play>
<play name="_new_member">
<fields>
<field type="" id="class" />
</fields>
<script type="ruby">
<![CDATA[ @member_state.permissions = {};]]>
</script>
</play>
<play name="bind_currency" player_classes="namer">
<fields>
<field type="player_namer" id="from" />
<field type="player_self" id="to" />
<field type="currency" id="currency" />
<field type="string" id="name" />
</fields>
<script type="ruby">
<![CDATA[
currencies = @play.to['currencies']
return "Currency must be specified" unless @play.currency.is_a?(Currency)
name = @play.name
name ||= @play.currency.name
currencies[@play.currency.id] = name
true
]]>
</script>
<play_sentence lang='en'> <from /> binds <currency /> to <to /> as <name /></play_sentence>
</play>
<play name="name_member" player_classes="namer">
<fields>
<field type="player_namer" id="from" />
<field type="user" id="user" />
<field type="string" id="name" />
</fields>
<script type="ruby">
<![CDATA[
ca = self.api_new_player('member',@play.user,@play.name)
if ca.valid?
true
else
ca.errors.full_messages.join('; ')
end
]]>
</script>
<play_sentence lang='en'><from /> dubs <user /> as <name /></play_sentence>
</play>
<play name="grant" player_classes="namer">
<fields>
<field type="player_namer" id="from" />
<field type="player_member" id="to" />
<field type="currency" id="currency" />
<field type="string" id="player_class" />
</fields>
<script type="ruby">
<![CDATA[
currency = @play.currency
to = @play.to['_currency_account']
ca = currency.api_new_player(@play.player_class,to.user,to.name)
if ca.valid?
perms = @play.to['permissions']
perms[currency.name] ||= {}
perms[currency.name][@play.player_class] = true
true
else
ca.errors.full_messages.join('; ')
end
]]>
</script>
<play_sentence lang='en'><from /> grants <to /> access to <currency /> as <player_class /></play_sentence>
</play>
<play name="revoke" player_classes="namer">
<fields>
<field type="player_namer" id="from" />
<field type="player_member" id="to" />
<field type="currency" id="currency" />
<field type="string" id="player_class" />
</fields>
<script type="ruby">
<![CDATA[
perms = @play.to['permissions']
perms[@play.currency] ||= {}
perms[@play.currency].delete(@play.player_class)
perms.delete(@play.currency) if perms[@play.currency].size == 0
true
]]>
</script>
<play_sentence lang='en'><from /> revokes <to />'s <player_class /> access to <currency /></play_sentence>
</play>
</plays>
</game>