X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Futils.rb;h=2b588b482c369aa2f9d74eced1f3a453ef33e408;hb=7f4e98a691ba6ee6f220fec982f17c900c929f1d;hp=a1a8c4843670872516755c1d7fd6278458eadd11;hpb=d30940cb5ff75cf7eab81f6a588b3b5297a762ad;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/utils.rb b/lib/rbot/utils.rb index a1a8c484..2b588b48 100644 --- a/lib/rbot/utils.rb +++ b/lib/rbot/utils.rb @@ -1,5 +1,285 @@ require 'net/http' require 'uri' +require 'tempfile' + +begin + $we_have_html_entities_decoder = require 'htmlentities' +rescue LoadError + $we_have_html_entities_decoder = false + module Irc + module Utils + UNESCAPE_TABLE = { + 'laquo' => '<<', + 'raquo' => '>>', + 'quot' => '"', + 'apos' => '\'', + 'micro' => 'u', + 'copy' => '(c)', + 'trade' => '(tm)', + 'reg' => '(R)', + '#174' => '(R)', + '#8220' => '"', + '#8221' => '"', + '#8212' => '--', + '#39' => '\'', + 'amp' => '&', + 'lt' => '<', + 'gt' => '>', + 'hellip' => '...', + 'nbsp' => ' ', +=begin + # extras codes, for future use... + 'zwnj' => '‌', + 'aring' => '\xe5', + 'gt' => '>', + 'yen' => '\xa5', + 'ograve' => '\xf2', + 'Chi' => 'Χ', + 'bull' => '•', + 'Egrave' => '\xc8', + 'Ntilde' => '\xd1', + 'upsih' => 'ϒ', + 'Yacute' => '\xdd', + 'asymp' => '≈', + 'radic' => '√', + 'otimes' => '⊗', + 'nabla' => '∇', + 'aelig' => '\xe6', + 'oelig' => 'œ', + 'equiv' => '≡', + 'Psi' => 'Ψ', + 'auml' => '\xe4', + 'circ' => 'ˆ', + 'Acirc' => '\xc2', + 'Epsilon' => 'Ε', + 'Yuml' => 'Ÿ', + 'Eta' => 'Η', + 'Icirc' => '\xce', + 'Upsilon' => 'Υ', + 'ndash' => '–', + 'there4' => '∴', + 'Prime' => '″', + 'prime' => '′', + 'psi' => 'ψ', + 'Kappa' => 'Κ', + 'rsaquo' => '›', + 'Tau' => 'Τ', + 'darr' => '↓', + 'ocirc' => '\xf4', + 'lrm' => '‎', + 'zwj' => '‍', + 'cedil' => '\xb8', + 'Ecirc' => '\xca', + 'not' => '\xac', + 'AElig' => '\xc6', + 'oslash' => '\xf8', + 'acute' => '\xb4', + 'lceil' => '⌈', + 'shy' => '\xad', + 'rdquo' => '”', + 'ge' => '≥', + 'Igrave' => '\xcc', + 'Ograve' => '\xd2', + 'euro' => '€', + 'dArr' => '⇓', + 'sdot' => '⋅', + 'nbsp' => '\xa0', + 'lfloor' => '⌊', + 'lArr' => '⇐', + 'Auml' => '\xc4', + 'larr' => '←', + 'Atilde' => '\xc3', + 'Otilde' => '\xd5', + 'szlig' => '\xdf', + 'clubs' => '♣', + 'diams' => '♦', + 'agrave' => '\xe0', + 'Ocirc' => '\xd4', + 'Iota' => 'Ι', + 'Theta' => 'Θ', + 'Pi' => 'Π', + 'OElig' => 'Œ', + 'Scaron' => 'Š', + 'frac14' => '\xbc', + 'egrave' => '\xe8', + 'sub' => '⊂', + 'iexcl' => '\xa1', + 'frac12' => '\xbd', + 'sbquo' => '‚', + 'ordf' => '\xaa', + 'sum' => '∑', + 'prop' => '∝', + 'Uuml' => '\xdc', + 'ntilde' => '\xf1', + 'sup' => '⊃', + 'theta' => 'θ', + 'prod' => '∏', + 'nsub' => '⊄', + 'hArr' => '⇔', + 'rlm' => '‏', + 'THORN' => '\xde', + 'infin' => '∞', + 'yuml' => '\xff', + 'Mu' => 'Μ', + 'le' => '≤', + 'Eacute' => '\xc9', + 'thinsp' => ' ', + 'ecirc' => '\xea', + 'bdquo' => '„', + 'Sigma' => 'Σ', + 'fnof' => 'ƒ', + 'Aring' => '\xc5', + 'tilde' => '˜', + 'frac34' => '\xbe', + 'emsp' => ' ', + 'mdash' => '—', + 'uarr' => '↑', + 'permil' => '‰', + 'Ugrave' => '\xd9', + 'rarr' => '→', + 'Agrave' => '\xc0', + 'chi' => 'χ', + 'forall' => '∀', + 'eth' => '\xf0', + 'rceil' => '⌉', + 'iuml' => '\xef', + 'gamma' => 'γ', + 'lambda' => 'λ', + 'harr' => '↔', + 'rang' => '〉', + 'xi' => 'ξ', + 'dagger' => '†', + 'divide' => '\xf7', + 'Ouml' => '\xd6', + 'image' => 'ℑ', + 'alefsym' => 'ℵ', + 'igrave' => '\xec', + 'otilde' => '\xf5', + 'Oacute' => '\xd3', + 'sube' => '⊆', + 'alpha' => 'α', + 'frasl' => '⁄', + 'ETH' => '\xd0', + 'lowast' => '∗', + 'Nu' => 'Ν', + 'plusmn' => '\xb1', + 'Euml' => '\xcb', + 'real' => 'ℜ', + 'sup1' => '\xb9', + 'sup2' => '\xb2', + 'sup3' => '\xb3', + 'Oslash' => '\xd8', + 'Aacute' => '\xc1', + 'cent' => '\xa2', + 'oline' => '‾', + 'Beta' => 'Β', + 'perp' => '⊥', + 'Delta' => 'Δ', + 'loz' => '◊', + 'pi' => 'π', + 'iota' => 'ι', + 'empty' => '∅', + 'euml' => '\xeb', + 'brvbar' => '\xa6', + 'iacute' => '\xed', + 'para' => '\xb6', + 'micro' => '\xb5', + 'cup' => '∪', + 'weierp' => '℘', + 'uuml' => '\xfc', + 'part' => '∂', + 'icirc' => '\xee', + 'delta' => 'δ', + 'omicron' => 'ο', + 'upsilon' => 'υ', + 'Iuml' => '\xcf', + 'Lambda' => 'Λ', + 'Xi' => 'Ξ', + 'kappa' => 'κ', + 'ccedil' => '\xe7', + 'Ucirc' => '\xdb', + 'cap' => '∩', + 'mu' => 'μ', + 'scaron' => 'š', + 'lsquo' => '‘', + 'isin' => '∈', + 'Zeta' => 'Ζ', + 'supe' => '⊇', + 'deg' => '\xb0', + 'and' => '∧', + 'tau' => 'τ', + 'pound' => '\xa3', + 'hellip' => '…', + 'curren' => '\xa4', + 'int' => '∫', + 'ucirc' => '\xfb', + 'rfloor' => '⌋', + 'ensp' => ' ', + 'crarr' => '↵', + 'ugrave' => '\xf9', + 'notin' => '∉', + 'exist' => '∃', + 'uArr' => '⇑', + 'cong' => '≅', + 'Dagger' => '‡', + 'oplus' => '⊕', + 'times' => '\xd7', + 'atilde' => '\xe3', + 'piv' => 'ϖ', + 'ni' => '∋', + 'Phi' => 'Φ', + 'lsaquo' => '‹', + 'Uacute' => '\xda', + 'Omicron' => 'Ο', + 'ang' => '∠', + 'ne' => '≠', + 'iquest' => '\xbf', + 'eta' => 'η', + 'yacute' => '\xfd', + 'Rho' => 'Ρ', + 'uacute' => '\xfa', + 'Alpha' => 'Α', + 'zeta' => 'ζ', + 'Omega' => 'Ω', + 'nu' => 'ν', + 'sim' => '∼', + 'sect' => '\xa7', + 'phi' => 'φ', + 'sigmaf' => 'ς', + 'macr' => '\xaf', + 'minus' => '−', + 'Ccedil' => '\xc7', + 'ordm' => '\xba', + 'epsilon' => 'ε', + 'beta' => 'β', + 'rArr' => '⇒', + 'rho' => 'ρ', + 'aacute' => '\xe1', + 'eacute' => '\xe9', + 'omega' => 'ω', + 'middot' => '\xb7', + 'Gamma' => 'Γ', + 'Iacute' => '\xcd', + 'lang' => '〈', + 'spades' => '♠', + 'rsquo' => '’', + 'uml' => '\xa8', + 'thorn' => '\xfe', + 'ouml' => '\xf6', + 'thetasym' => 'ϑ', + 'or' => '∨', + 'raquo' => '\xbb', + 'acirc' => '\xe2', + 'ldquo' => '“', + 'hearts' => '♥', + 'sigma' => 'σ', + 'oacute' => '\xf3', +=end + } + end + end +end + module Irc @@ -33,7 +313,7 @@ module Irc $stderr = $stdout exec(command, *args) rescue Exception => e - puts "exec of #{command} led to exception: #{e}" + puts "exec of #{command} led to exception: #{e.inspect}" Kernel::exit! 0 end puts "exec of #{command} failed" @@ -42,6 +322,23 @@ module Irc } end + + @@safe_save_dir = nil + def Utils.set_safe_save_dir(str) + @@safe_save_dir = str.dup + end + + def Utils.safe_save(file) + raise 'No safe save directory defined!' if @@safe_save_dir.nil? + basename = File.basename(file) + temp = Tempfile.new(basename,@@safe_save_dir) + temp.binmode + yield temp if block_given? + temp.close + File.rename(temp.path, file) + end + + # returns a string containing the result of an HTTP GET on the uri def Utils.http_get(uristr, readtimeout=8, opentimeout=4) @@ -75,9 +372,26 @@ module Irc } rescue => e # cheesy for now - $stderr.puts "Utils.http_get exception: #{e}, while trying to get #{uristr}" + error "Utils.http_get exception: #{e.inspect}, while trying to get #{uristr}" return nil end end + + def Utils.decode_html_entities(str) + if $we_have_html_entities_decoder + return HTMLEntities.decode_entities(str) + else + str.gsub(/(&(.+?);)/) { + symbol = $2 + # remove the 0-paddng from unicode integers + if symbol =~ /#(.+)/ + symbol = "##{$1.to_i.to_s}" + end + + # output the symbol's irc-translated character, or a * if it's unknown + UNESCAPE_TABLE[symbol] || '*' + } + end + end end end