godobject/smuxi-hooks-ruby

View on GitHub
doc/deployment.svg

Summary

Maintainability
Test Coverage
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
          'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg fill-opacity="1" xmlns:xlink="http://www.w3.org/1999/xlink" color-rendering="auto" color-interpolation="auto" stroke="black" text-rendering="auto" stroke-linecap="square" width="940" stroke-miterlimit="10" stroke-opacity="1" shape-rendering="auto" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" viewBox="230 150 940 710" height="710" xmlns="http://www.w3.org/2000/svg" font-family="&apos;Dialog&apos;" font-style="normal" stroke-linejoin="miter" font-size="12" stroke-dashoffset="0" image-rendering="auto"
><!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"
  /><g
  ><defs id="defs1"
    ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"
      ><path d="M0 0 L2147483647 0 L2147483647 2147483647 L0 2147483647 L0 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"
      ><path d="M0 0 L0 80 L330 80 L330 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"
      ><path d="M0 0 L0 110 L140 110 L140 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"
      ><path d="M0 0 L0 80 L180 80 L180 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"
      ><path d="M0 0 L0 60 L140 60 L140 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"
      ><path d="M0 0 L0 70 L220 70 L220 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"
      ><path d="M0 0 L0 60 L250 60 L250 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"
      ><path d="M0 0 L0 670 L900 670 L900 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath9"
      ><path d="M0 0 L0 150 L300 150 L300 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath10"
      ><path d="M0 0 L0 210 L300 210 L300 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath11"
      ><path d="M0 0 L0 490 L370 490 L370 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath12"
      ><path d="M0 0 L0 120 L164 120 L164 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath13"
      ><path d="M-0.5 -0.5 L-0.5 119.5 L163.5 119.5 L163.5 -0.5 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath14"
      ><path d="M0 0 L0 70 L250 70 L250 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath15"
      ><path d="M-0.5 -0.5 L-0.5 69.5 L249.5 69.5 L249.5 -0.5 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath16"
      ><path d="M0 0 L0 150 L250 150 L250 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath17"
      ><path d="M-0.5 -0.5 L-0.5 149.5 L249.5 149.5 L249.5 -0.5 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath18"
      ><path d="M0 0 L0 140 L250 140 L250 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath19"
      ><path d="M-0.5 -0.5 L-0.5 139.5 L249.5 139.5 L249.5 -0.5 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath20"
      ><path d="M0 0 L0 150 L164 150 L164 0 Z"
      /></clipPath
      ><clipPath clipPathUnits="userSpaceOnUse" id="clipPath21"
      ><path d="M-0.5 -0.5 L-0.5 149.5 L163.5 149.5 L163.5 -0.5 Z"
      /></clipPath
    ></defs
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(290,740)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><path d="M0.5 0.5 L318.5 0.5 L329 12.5 L329 79 L0.5 79 L0.5 0.5" clip-path="url(#clipPath2)" stroke="none"
    /></g
    ><g transform="translate(290,740)"
    ><path fill="none" d="M0.5 0.5 L318.5 0.5 L329 12.5 L329 79 L0.5 79 L0.5 0.5" clip-path="url(#clipPath2)"
      /><path fill="none" d="M318.5 0.5 L318.5 12.5 L329 12.5" clip-path="url(#clipPath2)"
      /><text x="5" font-size="14" y="18.1094" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >Each hook location represents a specific</text
      ><text x="5" font-size="14" y="34.2188" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >event within Smuxi. When such an event</text
      ><text x="5" font-size="14" y="50.3281" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >occurs, the plugin files linked by the</text
      ><text x="5" font-size="14" y="66.4375" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >symlinks in the hook location are executed.</text
    ></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(660,260)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><path d="M0.5 0.5 L128.5 0.5 L139 12.5 L139 109 L0.5 109 L0.5 0.5" clip-path="url(#clipPath3)" stroke="none"
    /></g
    ><g transform="translate(660,260)"
    ><path fill="none" d="M0.5 0.5 L128.5 0.5 L139 12.5 L139 109 L0.5 109 L0.5 0.5" clip-path="url(#clipPath3)"
      /><path fill="none" d="M128.5 0.5 L128.5 12.5 L139 12.5" clip-path="url(#clipPath3)"
      /><text x="5" font-size="14" y="18.1094" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >A symlink to the</text
      ><text x="5" font-size="14" y="34.2188" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >executable plugin</text
      ><text x="5" font-size="14" y="50.3281" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >file is installed in</text
      ><text x="5" font-size="14" y="66.4375" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >one or more of</text
      ><text x="5" font-size="14" y="82.5469" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >Smuxi's hook</text
      ><text x="5" font-size="14" y="98.6562" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >locations.</text
    ></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(950,350)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><path d="M0.5 0.5 L168.5 0.5 L179 12.5 L179 79 L0.5 79 L0.5 0.5" clip-path="url(#clipPath4)" stroke="none"
    /></g
    ><g transform="translate(950,350)"
    ><path fill="none" d="M0.5 0.5 L168.5 0.5 L179 12.5 L179 79 L0.5 79 L0.5 0.5" clip-path="url(#clipPath4)"
      /><path fill="none" d="M168.5 0.5 L168.5 12.5 L179 12.5" clip-path="url(#clipPath4)"
      /><text x="5" font-size="14" y="18.1094" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >A plugin file contains a</text
      ><text x="5" font-size="14" y="34.2188" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >Ruby class inherited</text
      ><text x="5" font-size="14" y="50.3281" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >from GodObject::</text
      ><text x="5" font-size="14" y="66.4375" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >SmuxiHooks::Plugin.</text
    ></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(830,760)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="138.5" height="58.5" y="0.5" clip-path="url(#clipPath5)" stroke="none"
    /></g
    ><g transform="translate(830,760)"
    ><rect fill="none" x="0.5" width="138.5" height="58.5" y="0.5" clip-path="url(#clipPath5)"
      /><text x="39" font-size="14" y="27.3094" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«plugin»</text
      ><text x="12" font-size="14" y="43.4188" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >KeywordCatcher</text
    ></g
    ><g font-size="14" transform="translate(830,760)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><rect x="110.86" width="11.2" height="5.6" y="9.7" clip-path="url(#clipPath5)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(830,760)"
    ><rect fill="none" x="110.86" width="11.2" height="5.6" y="9.7" clip-path="url(#clipPath5)"
    /></g
    ><g font-size="14" transform="translate(830,760)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><rect x="110.86" width="11.2" height="5.6" y="19.5" clip-path="url(#clipPath5)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(830,760)"
    ><rect fill="none" x="110.86" width="11.2" height="5.6" y="19.5" clip-path="url(#clipPath5)"
      /><path fill="none" d="M116.46 15.3 L116.46 19.5" clip-path="url(#clipPath5)"
      /><path fill="none" d="M116.46 9.7 L116.46 5.5 L135.5 5.5 L135.5 29.3 L116.46 29.3 L116.46 25.1" clip-path="url(#clipPath5)"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(780,620)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="218.5" height="68.5" y="0.5" clip-path="url(#clipPath6)" stroke="none"
    /></g
    ><g transform="translate(780,620)"
    ><rect fill="none" x="0.5" width="218.5" height="68.5" y="0.5" clip-path="url(#clipPath6)"
      /><text x="66" font-size="14" y="27.3094" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«plugin file»</text
      ><text x="40" font-size="14" y="43.4188" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >keyword_catcher.rb    </text
    ></g
    ><g font-size="14" transform="translate(780,620)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><path d="M194.5 5.5 L208.5 5.5 L215.5 12.5 L215.5 30.7 L194.5 30.7 L194.5 5.5" clip-path="url(#clipPath6)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(780,620)"
    ><path fill="none" d="M194.5 5.5 L208.5 5.5 L215.5 12.5 L215.5 30.7 L194.5 30.7 L194.5 5.5" clip-path="url(#clipPath6)"
      /><path fill="none" d="M208.5 5.5 L208.5 12.5 L215.5 12.5" clip-path="url(#clipPath6)"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(330,620)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="248.5" height="58.5" y="0.5" clip-path="url(#clipPath7)" stroke="none"
    /></g
    ><g transform="translate(330,620)"
    ><rect fill="none" x="0.5" width="248.5" height="58.5" y="0.5" clip-path="url(#clipPath7)"
      /><text x="58" font-size="14" y="27.3094" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«hook executable»</text
      ><text x="55" font-size="14" y="43.4188" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >keyword_catcher.rb</text
    ></g
    ><g font-size="14" transform="translate(330,620)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><path d="M224.5 5.5 L238.5 5.5 L245.5 12.5 L245.5 30.7 L224.5 30.7 L224.5 5.5" clip-path="url(#clipPath7)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(330,620)"
    ><path fill="none" d="M224.5 5.5 L238.5 5.5 L245.5 12.5 L245.5 30.7 L224.5 30.7 L224.5 5.5" clip-path="url(#clipPath7)"
      /><path fill="none" d="M238.5 5.5 L238.5 12.5 L245.5 12.5" clip-path="url(#clipPath7)"
    /></g
    ><g fill="rgb(175,175,175)" fill-opacity="0.4902" transform="translate(250,170)" stroke-opacity="0.4902" stroke="rgb(175,175,175)"
    ><path d="M0.5 10.5 L10.5 0.5 L899 0.5 L899 660.5 L890.5 669 L890.5 10.5 L0.5 10.5" clip-path="url(#clipPath8)" stroke="none"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(250,170)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><path fill="none" d="M0.5 10.5 L10.5 0.5 L899 0.5 L899 660.5 L890.5 669 L890.5 10.5 L0.5 10.5" clip-path="url(#clipPath8)"
    /></g
    ><g transform="translate(250,170)"
    ><path fill="none" d="M0.5 10.5 L10.5 0.5 L899 0.5 L899 660.5 L890.5 669" clip-path="url(#clipPath8)"
      /><path fill="none" d="M890.5 10.5 L899 0.5" clip-path="url(#clipPath8)"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(250,170)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="890" height="658.5" y="10.5" clip-path="url(#clipPath8)" stroke="none"
    /></g
    ><g transform="translate(250,170)"
    ><rect fill="none" x="0.5" width="890" height="658.5" y="10.5" clip-path="url(#clipPath8)"
      /><text x="413" font-size="14" y="28.1094" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«device»</text
      ><text x="388" font-size="14" y="44.2188" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >Some Computer</text
    ></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(820,280)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="138.5" height="58.5" y="0.5" clip-path="url(#clipPath5)" stroke="none"
    /></g
    ><g transform="translate(820,280)"
    ><rect fill="none" x="0.5" width="138.5" height="58.5" y="0.5" clip-path="url(#clipPath5)"
      /><text x="39" font-size="14" y="27.3094" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«plugin»</text
      ><text x="29" font-size="14" y="43.4188" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >ChatLogger</text
    ></g
    ><g font-size="14" transform="translate(820,280)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><rect x="110.86" width="11.2" height="5.6" y="9.7" clip-path="url(#clipPath5)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(820,280)"
    ><rect fill="none" x="110.86" width="11.2" height="5.6" y="9.7" clip-path="url(#clipPath5)"
    /></g
    ><g font-size="14" transform="translate(820,280)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><rect x="110.86" width="11.2" height="5.6" y="19.5" clip-path="url(#clipPath5)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(820,280)"
    ><rect fill="none" x="110.86" width="11.2" height="5.6" y="19.5" clip-path="url(#clipPath5)"
      /><path fill="none" d="M116.46 15.3 L116.46 19.5" clip-path="url(#clipPath5)"
      /><path fill="none" d="M116.46 9.7 L116.46 5.5 L135.5 5.5 L135.5 29.3 L116.46 29.3 L116.46 25.1" clip-path="url(#clipPath5)"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(780,440)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="218.5" height="68.5" y="0.5" clip-path="url(#clipPath6)" stroke="none"
    /></g
    ><g transform="translate(780,440)"
    ><rect fill="none" x="0.5" width="218.5" height="68.5" y="0.5" clip-path="url(#clipPath6)"
      /><text x="66" font-size="14" y="27.3094" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«plugin file»</text
      ><text x="59" font-size="14" y="43.4188" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >chat_logger.rb    </text
    ></g
    ><g font-size="14" transform="translate(780,440)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><path d="M194.5 5.5 L208.5 5.5 L215.5 12.5 L215.5 30.7 L194.5 30.7 L194.5 5.5" clip-path="url(#clipPath6)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(780,440)"
    ><path fill="none" d="M194.5 5.5 L208.5 5.5 L215.5 12.5 L215.5 30.7 L194.5 30.7 L194.5 5.5" clip-path="url(#clipPath6)"
      /><path fill="none" d="M208.5 5.5 L208.5 12.5 L215.5 12.5" clip-path="url(#clipPath6)"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(330,370)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="248.5" height="58.5" y="0.5" clip-path="url(#clipPath7)" stroke="none"
    /></g
    ><g transform="translate(330,370)"
    ><rect fill="none" x="0.5" width="248.5" height="58.5" y="0.5" clip-path="url(#clipPath7)"
      /><text x="58" font-size="14" y="27.3094" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«hook executable»</text
      ><text x="74" font-size="14" y="43.4188" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >chat_logger.rb</text
    ></g
    ><g font-size="14" transform="translate(330,370)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><path d="M224.5 5.5 L238.5 5.5 L245.5 12.5 L245.5 30.7 L224.5 30.7 L224.5 5.5" clip-path="url(#clipPath7)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(330,370)"
    ><path fill="none" d="M224.5 5.5 L238.5 5.5 L245.5 12.5 L245.5 30.7 L224.5 30.7 L224.5 5.5" clip-path="url(#clipPath7)"
      /><path fill="none" d="M238.5 5.5 L238.5 12.5 L245.5 12.5" clip-path="url(#clipPath7)"
    /></g
    ><g fill="rgb(175,175,175)" fill-opacity="0.4902" transform="translate(310,300)" stroke-opacity="0.4902" stroke="rgb(175,175,175)"
    ><path d="M0.5 10.5 L10.5 0.5 L299 0.5 L299 140.5 L290.5 149 L290.5 10.5 L0.5 10.5" clip-path="url(#clipPath9)" stroke="none"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(310,300)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><path fill="none" d="M0.5 10.5 L10.5 0.5 L299 0.5 L299 140.5 L290.5 149 L290.5 10.5 L0.5 10.5" clip-path="url(#clipPath9)"
    /></g
    ><g transform="translate(310,300)"
    ><path fill="none" d="M0.5 10.5 L10.5 0.5 L299 0.5 L299 140.5 L290.5 149" clip-path="url(#clipPath9)"
      /><path fill="none" d="M290.5 10.5 L299 0.5" clip-path="url(#clipPath9)"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(310,300)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="290" height="138.5" y="10.5" clip-path="url(#clipPath9)" stroke="none"
    /></g
    ><g transform="translate(310,300)"
    ><rect fill="none" x="0.5" width="290" height="138.5" y="10.5" clip-path="url(#clipPath9)"
      /><text x="89" font-size="14" y="28.1094" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«hook location»</text
      ><text x="15" font-size="14" y="44.2188" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >engine/session/on-message-received</text
    ></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(330,550)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="248.5" height="58.5" y="0.5" clip-path="url(#clipPath7)" stroke="none"
    /></g
    ><g transform="translate(330,550)"
    ><rect fill="none" x="0.5" width="248.5" height="58.5" y="0.5" clip-path="url(#clipPath7)"
      /><text x="58" font-size="14" y="27.3094" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«hook executable»</text
      ><text x="74" font-size="14" y="43.4188" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >chat_logger.rb</text
    ></g
    ><g font-size="14" transform="translate(330,550)" fill-opacity="0" fill="rgb(255,255,255)" font-family="sans-serif" stroke="rgb(255,255,255)" stroke-opacity="0"
    ><path d="M224.5 5.5 L238.5 5.5 L245.5 12.5 L245.5 30.7 L224.5 30.7 L224.5 5.5" clip-path="url(#clipPath7)" stroke="none"
    /></g
    ><g font-family="sans-serif" font-size="14" transform="translate(330,550)"
    ><path fill="none" d="M224.5 5.5 L238.5 5.5 L245.5 12.5 L245.5 30.7 L224.5 30.7 L224.5 5.5" clip-path="url(#clipPath7)"
      /><path fill="none" d="M238.5 5.5 L238.5 12.5 L245.5 12.5" clip-path="url(#clipPath7)"
    /></g
    ><g fill="rgb(175,175,175)" fill-opacity="0.4902" transform="translate(310,490)" stroke-opacity="0.4902" stroke="rgb(175,175,175)"
    ><path d="M0.5 10.5 L10.5 0.5 L299 0.5 L299 200.5 L290.5 209 L290.5 10.5 L0.5 10.5" clip-path="url(#clipPath10)" stroke="none"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(310,490)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><path fill="none" d="M0.5 10.5 L10.5 0.5 L299 0.5 L299 200.5 L290.5 209 L290.5 10.5 L0.5 10.5" clip-path="url(#clipPath10)"
    /></g
    ><g transform="translate(310,490)"
    ><path fill="none" d="M0.5 10.5 L10.5 0.5 L299 0.5 L299 200.5 L290.5 209" clip-path="url(#clipPath10)"
      /><path fill="none" d="M290.5 10.5 L299 0.5" clip-path="url(#clipPath10)"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(310,490)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="290" height="198.5" y="10.5" clip-path="url(#clipPath10)" stroke="none"
    /></g
    ><g transform="translate(310,490)"
    ><rect fill="none" x="0.5" width="290" height="198.5" y="10.5" clip-path="url(#clipPath10)"
      /><text x="89" font-size="14" y="28.1094" clip-path="url(#clipPath10)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«hook location»</text
      ><text x="30" font-size="14" y="44.2188" clip-path="url(#clipPath10)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >engine/session/on-message-sent</text
    ></g
    ><g fill="rgb(175,175,175)" fill-opacity="0.4902" transform="translate(280,230)" stroke-opacity="0.4902" stroke="rgb(175,175,175)"
    ><path d="M0.5 10.5 L10.5 0.5 L369 0.5 L369 480.5 L360.5 489 L360.5 10.5 L0.5 10.5" clip-path="url(#clipPath11)" stroke="none"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(280,230)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><path fill="none" d="M0.5 10.5 L10.5 0.5 L369 0.5 L369 480.5 L360.5 489 L360.5 10.5 L0.5 10.5" clip-path="url(#clipPath11)"
    /></g
    ><g transform="translate(280,230)"
    ><path fill="none" d="M0.5 10.5 L10.5 0.5 L369 0.5 L369 480.5 L360.5 489" clip-path="url(#clipPath11)"
      /><path fill="none" d="M360.5 10.5 L369 0.5" clip-path="url(#clipPath11)"
    /></g
    ><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(280,230)" stroke-opacity="0" stroke="rgb(255,255,255)"
    ><rect x="0.5" width="360" height="478.5" y="10.5" clip-path="url(#clipPath11)" stroke="none"
    /></g
    ><g transform="translate(280,230)"
    ><rect fill="none" x="0.5" width="360" height="478.5" y="10.5" clip-path="url(#clipPath11)"
      /><text x="90" font-size="14" y="28.1094" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >«execution environment»</text
      ><text x="131" font-size="14" y="44.2188" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" xml:space="preserve"
      >Smuxi Engine</text
    ></g
    ><g stroke-dasharray="8,5" font-size="14" stroke-miterlimit="5" font-family="sans-serif" transform="translate(810.5,660.5)" stroke-linecap="butt"
    ><line y2="65" fill="none" x1="90" clip-path="url(#clipPath13)" x2="90" y1="100"
      /><line y2="30" fill="none" x1="90" clip-path="url(#clipPath13)" x2="90" y1="65"
      /><line stroke-linecap="square" clip-path="url(#clipPath13)" fill="none" x1="90" x2="96" y1="30" y2="42" stroke-dasharray="none" stroke-miterlimit="10"
      /><line stroke-linecap="square" clip-path="url(#clipPath13)" fill="none" x1="90" x2="84" y1="30" y2="42" stroke-dasharray="none" stroke-miterlimit="10"
      /><text stroke-linecap="square" x="35" y="62" clip-path="url(#clipPath13)" stroke-dasharray="none" stroke="none" xml:space="preserve" stroke-miterlimit="10"
      >&lt;&lt;manifest&gt;&gt;</text
    ></g
    ><g stroke-dasharray="8,5" font-size="14" stroke-miterlimit="5" font-family="sans-serif" transform="translate(550.5,600.5)" stroke-linecap="butt"
    ><line y2="50" fill="none" x1="30" clip-path="url(#clipPath15)" x2="130" y1="50"
      /><line y2="50" fill="none" x1="130" clip-path="url(#clipPath15)" x2="230" y1="50"
      /><line stroke-linecap="square" clip-path="url(#clipPath15)" fill="none" x1="229" x2="217" y1="50" y2="56" stroke-dasharray="none" stroke-miterlimit="10"
      /><line stroke-linecap="square" clip-path="url(#clipPath15)" fill="none" x1="229" x2="217" y1="50" y2="44" stroke-dasharray="none" stroke-miterlimit="10"
      /><text stroke-linecap="square" x="79" y="47" clip-path="url(#clipPath15)" stroke-dasharray="none" stroke="none" xml:space="preserve" stroke-miterlimit="10"
      >&lt;&lt;symlink&gt;&gt;</text
    ></g
    ><g stroke-dasharray="8,5" font-size="14" stroke-miterlimit="5" font-family="sans-serif" transform="translate(550.5,450.5)" stroke-linecap="butt"
    ><line y2="130" fill="none" x1="30" clip-path="url(#clipPath17)" x2="160" y1="130"
      /><line y2="80" fill="none" x1="160" clip-path="url(#clipPath17)" x2="195" y1="130"
      /><line y2="30" fill="none" x1="195" clip-path="url(#clipPath17)" x2="230" y1="80"
      /><line stroke-linecap="square" clip-path="url(#clipPath17)" fill="none" x1="229" x2="227" y1="30" y2="43" stroke-dasharray="none" stroke-miterlimit="10"
      /><line stroke-linecap="square" clip-path="url(#clipPath17)" fill="none" x1="229" x2="217" y1="30" y2="36" stroke-dasharray="none" stroke-miterlimit="10"
      /><text stroke-linecap="square" x="109" y="127" clip-path="url(#clipPath17)" stroke-dasharray="none" stroke="none" xml:space="preserve" stroke-miterlimit="10"
      >&lt;&lt;symlink&gt;&gt;</text
    ></g
    ><g stroke-dasharray="8,5" font-size="14" stroke-miterlimit="5" font-family="sans-serif" transform="translate(550.5,350.5)" stroke-linecap="butt"
    ><line y2="50" fill="none" x1="30" clip-path="url(#clipPath19)" x2="160" y1="50"
      /><line y2="85" fill="none" x1="160" clip-path="url(#clipPath19)" x2="195" y1="50"
      /><line y2="120" fill="none" x1="195" clip-path="url(#clipPath19)" x2="230" y1="85"
      /><line stroke-linecap="square" clip-path="url(#clipPath19)" fill="none" x1="229" x2="216" y1="119" y2="115" stroke-dasharray="none" stroke-miterlimit="10"
      /><line stroke-linecap="square" clip-path="url(#clipPath19)" fill="none" x1="229" x2="225" y1="119" y2="106" stroke-dasharray="none" stroke-miterlimit="10"
      /><text stroke-linecap="square" x="109" y="47" clip-path="url(#clipPath19)" stroke-dasharray="none" stroke="none" xml:space="preserve" stroke-miterlimit="10"
      >&lt;&lt;symlink&gt;&gt;</text
    ></g
    ><g stroke-dasharray="8,5" font-size="14" stroke-miterlimit="5" font-family="sans-serif" transform="translate(800.5,310.5)" stroke-linecap="butt"
    ><line y2="80" fill="none" x1="90" clip-path="url(#clipPath21)" x2="90" y1="30"
      /><line y2="130" fill="none" x1="90" clip-path="url(#clipPath21)" x2="90" y1="80"
      /><line stroke-linecap="square" clip-path="url(#clipPath21)" fill="none" x1="90" x2="84" y1="129" y2="117" stroke-dasharray="none" stroke-miterlimit="10"
      /><line stroke-linecap="square" clip-path="url(#clipPath21)" fill="none" x1="90" x2="96" y1="129" y2="117" stroke-dasharray="none" stroke-miterlimit="10"
      /><text stroke-linecap="square" x="35" y="77" clip-path="url(#clipPath21)" stroke-dasharray="none" stroke="none" xml:space="preserve" stroke-miterlimit="10"
      >&lt;&lt;manifest&gt;&gt;</text
    ></g
  ></g
></svg
>