bar.rb
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· RB 代码 · 共 393 行
RB
393 行
# Copyright (c) 2006 Harald Sitter <harald.sitter@kdemail.net>## Permission is hereby granted, free of charge, to any person obtaining a copy# of this software and associated documentation files (the "Software"), to# deal in the Software without restriction, including without limitation the# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or# sell copies of the Software, and to permit persons to whom the Software is# furnished to do so, subject to the following conditions:## The above copyright notice and this permission notice shall be included in# all copies of the Software and its documentation and acknowledgment shall be# given in the documentation and software packages that this Software was# used.## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL# THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.## NOTE: for description of beats see 'calc beats' in #amaork# Class for storing good valuesStock = Struct.new( "Stock", :amount, :max, :beats, :deliverybeat, :version )# Class for storing costum repliesReply = Struct.new( "Reply", :reply, :version )class BARPlugin < Plugin #### # Initialize Database #### def initialize() super if @registry.has_key?(:stock) @stock = @registry[:stock] else @stock = Hash.new end if @registry.has_key?(:reply) @reply = @registry[:reply] else @reply = Hash.new end end #### # Save Database #### def save @registry[:stock] = @stock @registry[:reply] = @reply end #### # Get Delivery status #### def delivery( m, name ) beat_cur = Time.new.strftime '%Y%j%H%M%S' deliverybeat = @stock[name].deliverybeat if beat_cur.to_f >= deliverybeat.to_f @stock[name].amount = @stock[name].max @stock[name].deliverybeat = nil @registry[:stock] = @stock @available = true # if it's not available, set value according else @togo = (deliverybeat.to_f - beat_cur.to_f) / 100 @available = false end # TODO: compare current beat with order beat and decied whether to increase # the amount to amount of order or not. If not, tell the user how long # to wait. end #### # Check whether good is in database #### def status( name, reg ) @inreg = true unless reg.has_key?( name ) @inreg = false end end################################################################################ #### # Add new Good to Database #### def handle_add( m, params ) # lame auth check # TODO: need to get a look into new auth system if m.sourcenick.to_s != "apachelogger" m.reply( "sorry, not yet available for public use" ) return end name = params[:name].downcase amount = params[:amount] beats = params[:beats] # temp check whether values got entered in proper order etc. if amount.to_s.scan(/^([0-9]+)/).length == 0 m.reply( "You have to define amount and beats - note that items which names consits of more than 2 words don't work yet") return end # !!!tag version!!! version = "1" # caluclate beats for one good and multiply with 100 -> better for later use beats = beats.to_f / amount.to_f beats *= 100 # current amount || maximal amount || beats for one good || deliverybeat (always 'nil' if not reordered) || tag version stock = Stock.new( amount, amount, beats, nil, version ) @stock[name] = stock m.reply( "done" ) end #### # Add reply for defined Good #### def handle_add( m, params ) # lame auth check # TODO: need to get a look into new auth system if m.sourcenick.to_s != "apachelogger" m.reply( "sorry, not yet available for public use" ) return end name = params[:name].downcase reply = params[:reply] version = "1" # !!!tag version!!! # check whether good is in database status( name, @stock ) if @inreg == false m.reply( "#{name} does not exist." ); return end # Put data into database, should be understandable ^^ stock = Reply.new( reply, version ) @reply[name] = reply m.reply( "done" ) end #### # Delete Good from Database #### def handle_del( m, params ) name = params[:name].downcase.sub(/[ ]/, '_') unless @stock.has_key?( name ) m.reply( "Not in registry." ); return end @stock.delete(name) @registry[:stock] = @stock m.reply( "done" ) end def handle_list( m, params ) if @stock.length == 0 m.reply( "Nothing available." ); return end m.reply "Finite goods: #{@stock.keys.sort.join(', ')}" end #### # Show information about Good (amount, max, beats, deliverybeat, tag version) #### def handle_show( m, params ) name = params[:name].downcase unless @stock.has_key?( name ) m.reply( "#{name} does not exist." ); return end cmd = @stock[name] m.reply( "Amount: #{cmd.amount} ||| Max: #{cmd.max} ||| 1 good per #{cmd.beats} beats ||| #{if @stock[name].deliverybeat != nil; @stock[name].deliverybeat; end } ||| Tag version: #{cmd.version}" ) end #### # Show costum reply #### def handle_show_reply( m, params ) name = params[:name].downcase status( name, @reply ) if @inreg == false m.reply( "#{name} does not exist." ); return end cmd = @reply[name] m.reply( "Reply: #{cmd.reply} ||| Tag version: #{cmd.version}" ) end #### # Process reording of Good (calculate deliverybeat and set it) #### def handle_reorder( m, params ) name = params[:name].downcase # cur_y = Time.new.strftime '%Y' # cur_d = Time.new.strftime '%j' # cur_h = Time.new.strftime '%H' # cur_m = Time.new.strftime '%M' # cur_s = Time.new.strftime '%S' # cur_beat = ((cur_y.to_i * 31536000) + (cur_d.to_i * 86400) + (cur_h.to_i * 3600) + (cur_m.to_i * 60) + cur_s.to_i) beat_cur = Time.new.strftime '%Y%j%H%M%S' unless @stock.has_key?( name ) m.reply( "#{name} does not exist." ); return end if @stock[name].deliverybeat != nil delivery( m, name ) if @available == true m.reply( "#{m.sourcenick}: #{name} is again available now." ); return else m.reply( "#{m.sourcenick}: #{name} has already been ordered (#{@togo.to_s} minutes)." ); return end end if @stock[name].amount.to_f >= ((@stock[name].max.to_f * 25) / 100) m.reply( " #{m.sourcenick}: We still have enough #{name}, no need to reorder." ); return end # run calculation after checks to save resources if not needed deliverybeat = beat_cur.to_i + (@stock[name].beats.to_i * @stock[name].max.to_i) @stock[name].deliverybeat = deliverybeat @registry[:stock] = @stock m.reply( "Billy Kay is on his way to the supplier....") # NOTE: needs new registry hashes for beat per amount and for beat at time # of order # TODO: implement amount option end #### # Reset reording of Good (set deliverybeat to nil) #### def handle_reorder_reset( m, params ) name = params[:name].downcase unless @stock.has_key?( name ) m.reply( "#{name} does not exist." ); return end @stock[name].deliverybeat = nil @registry[:stock] = @stock m.reply( "done" ) end #### # Main Process, takes care of usual order cmd (check availability, delivery status, special order etc.) #### def process( m, params ) order = nil @available = false @togo = nil scantmp = m.params.scan(/.*for.*/) if scantmp.length == 0 name = m.params nick = m.sourcenick else for_idx = m.params =~ /\s+\bfor\b/ name = m.params[0, for_idx] for_idx = m.params.reverse =~ /\s+\brof\b/ nick = m.params.reverse[0, for_idx] nick = nick.reverse end name = name.downcase # check whether the order is in our database if @stock.has_key?( name ) # if the order is in our db, check whether we still have some of it - if yes: reduze amount by one if @stock[name].amount.to_f <= 0 # if we don't have the order anymore - check whether the deliverybeat equals nil, if this is case tell the user to reorder if @stock[name].deliverybeat != nil # check whether the reordered good is available - if not, tell the user it's in progress and how long to go delivery( m, name ) if @available != true order = "tells #{nick} that we are out of #{name} but a new delivery is already in progress (#{@togo.to_s} minutes)." @bot.action m.replyto, order; return end # tell _the ordering user_ to reorder because we are out of the ordered good else m.reply( "#{m.sourcenick}: We are out of #{name}, you should reorder some of it."); return end end # decrease amount of ordered good by one @stock[name].amount = @stock[name].amount.to_i - 1 end # !!!! special feature if someone stands something for everyone !!!! if nick == "everyone" order = "is going to his secret storehouse to get #{name} for #{nick} - might be expensive." @bot.action m.replyto, order # !!!! result: amount is going down to 0 no matter which value it was before @stock[name].amount = "0" return end order = case name # please keep alphabetical order!!!!!!! when "bed" then "is placing a cot for #{nick} in the corner of #{m.target}." when "beer" then "gives #{name} a nice frosty mug of #{name}." when "birthday package" then "is running to the corner shop to get a birthday present." when "breakfast" then "slides a cigarette, a cup of hot coffee and a bagel with cream cheese down the bar to #{nick}." when "breakfast, au" then "slides a slab of bread with some mixture of salt and battery acid, called vegemite, and a glass of water down the bar to #{nick}." when "breakfast, at" then "slides 5 floors of backon and some wurst with bread, a glass of schnaps and a new deck down the bar to #{nick}." when "breakfast, de" then "slides a noppers down the bar to #{nick}." when "breakfast, hangover" then "slides 2 liter of water, one glass of tomato juice, 3 rollmops and chips down the bar to #{nick}" when "breakfast, uk, full" then "slides scrambled eggs, bacon, one sausage, black pudding, mushrooms, baked beans, hash browns, half of a tomato, one toast and a tea with fresh milk down the bar to #{nick}." when "breakfast, us" then "slides breakfast cereals, a bagel, 2 pancakes, scrambled eggs and a cup of hot coffee down the bar to #{nick}." when "brain" then "shouts: OMG!!!!! RED ALERT! We lost a #{name}. Get me a medic, NOW!" when "can of whoopass" then "opens up a can of whoopass on #{nick}. Chuck Norris jumps out." when "chocolate" then "hands #{nick} a bar of Noir de Noir." when "coffee" then "slides #{name} with milk down the bar to #{nick}." when "cushion" then "is getting #{nick} a cushion from the chill area of #amarok." when "heineken" then "gives #{nick} a nice frosty wonderful green bottle of #{name}." when "good beer" then "slides the finest Belgium Trappist beer down the bar to #{nick}." when "kubuntu" then "tells #{nick} to better use http://shipit.kubuntu.org" when "release" then "pokes apachelogger." when "tea" then "gives #{nick} a nice hot cup of #{name}." when "tea, earl grey, hot" then "is replicating a hot cup of earl grey for captain #{nick}." when "wine" then "pours #{nick} a delicious glass from the channel's wine cellar." else "slides #{name} down the bar to #{nick}" end @bot.action m.replyto, order if name == "birthday package" @bot.action m.replyto, "slides a birthday cake and a present down the bar to #{nick} and gives everyone a nice frosty mug of beer." m.reply( "Happy birthday to you, happy birthday to you, happy birthday #{nick}, happy birthday to you!!!! - Wooooho!" ) m.reply( "\002Happy Birthday #{nick} :D" ) m.reply( "To your health!" ) end endendplugin = BARPlugin.newplugin.register("order")plugin.map 'order *wish', :action => 'process'# plugin.map 'order :wish for *nick', :action => 'process'plugin.map 'order-adm add :name :amount :beats', :action => 'handle_add', :auth => '80'# TODO: point out how to make it work with 2 or more word namesplugin.map 'order-adm del :name', :action => 'handle_del', :auth => 'brain'plugin.map 'order-adm list', :action => 'handle_list'plugin.map 'order-adm show :name', :action => 'handle_show'# plugin.map 'order-adm show-reply :name', :action => 'handle_show_reply'plugin.map 'reorder :name', :action => 'handle_reorder'plugin.map 'reorder reset :name', :action => 'handle_reorder_reset'
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?