http://opensimulator.org/api.php?action=feedcontributions&user=DrScofield&feedformat=atomOpenSimulator - User contributions [en]2024-03-29T04:48:29ZUser contributionsMediaWiki 1.19.9http://opensimulator.org/wiki/Development_TeamDevelopment Team2010-03-17T12:00:27Z<p>DrScofield: dropping the IBM hat, putting on the hobbyist hat</p>
<hr />
<div>__NOTOC__<br />
{{Template:Quicklinks}}<br />
<br />
[[Technical Reference | Technical Reference]] -> [[Technical Reference/terms | Terms]] -> [[Development_Team | Core Development Team]]<br />
<br />
== Active OpenSim Core Developers ==<br />
These people have commit access to our central SVN server and are [http://www.ohloh.net/projects/4753/contributors regular contributors] to the codebase.<br />
** '''Only voted in developers should be listed here, please do not list yourself''' <br />
(please add in as much info as you like for your name) <br />
<br />
<table border="1" cellpadding="2" cellspacing="0" class="sortable"><br />
<tr><br />
<th>Photo </th><br />
<th>IRC Nick </th><br />
<th>Name</th><br />
<th>SL Avatar</th><br />
<th>Other Grid</th><br />
<th>Time Zone<br>(UTC)</th><br />
<th>Org</th><br />
<th>Areas of Interest</th><br />
</tr><br />
<br />
<tr><br />
<td /><br />
<td>[[User:MW |MW ]]</td><br />
<td>Darren</td><br />
<td>Wright Juran</td><br />
<td></td><br />
<td>0</td><br />
<td></td><br />
<td>Everything</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Adam Frisby|Adam Frisby]]</td><br />
<td>Adam Frisby</td><br />
<td>Adam Zaius</td><br />
<td></td><br />
<td>+8</td><br />
<td>DeepThink Pty Ltd</td><br />
<td>Terrain, Performance</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:MingChen|MingChen]]</td><br />
<td>Mike/Michael Ortman</td><br />
<td>Ming Chen</td><br />
<td></td><br />
<td>-6 (-5 in Summer)</td><br />
<td>DeepThink Pty Ltd</td><br />
<td>Estate/Parcel Support/Modules/Keeping things all neat and tidy.</td><br />
</tr><br />
<tr> <br />
<td /><br />
<td>[[User:SeanDague|sdague]]</td><br />
<td>Sean Dague</td><br />
<td>Neas Bade</td><br />
<td></td><br />
<td>-5</td><br />
<td>IBM</td><br />
<td>Database, Linux, Testing, Misc</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Tedd|Tedd]]</td><br />
<td>Tedd Hansen</td><br />
<td>Tedd Maa</td><br />
<td></td><br />
<td>+1</td><br />
<td>Tedd Hansen</td><br />
<td>Programming/Scripting/Architecture</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>ckrinke</td><br />
<td>Charles&nbsp;Krinke</td><br />
<td>Charlesk&nbsp;Bing</td><br />
<td></td><br />
<td>-8</td><br />
<td>&nbsp;</td><br />
<td>Reliability/Grid servers/ll-functions</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:chi11ken|chi11ken]]</td><br />
<td>Jeff Ames</td><br />
<td>Chillken Proto</td><br />
<td><br/></td><br />
<td>+9</td><br />
<td>[http://www.genkii.com Genkii]</td><br />
<td><br/></td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:adjohn|adjohn]]</td><br />
<td>Adam Johnson</td><br />
<td>Zeuz Zenovka</td><br />
<td><br/></td><br />
<td>+9</td><br />
<td>[http://www.genkii.com Genkii]</td><br />
<td><br/></td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:joha1|joha1]]</td><br />
<td>Johan Berntsson</td><br />
<td>Joppi Brandenburg</td><br />
<td><br/></td><br />
<td>+9</td><br />
<td>[http://www.3di.jp/en/ 3Di Inc, Japan]<br/>http://www.3di.jp/en/</td><br />
<td>Performance, packet handling/libSL</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Teravus|Teravus]]</td><br />
<td>Daniel Olivares</td><br />
<td>Teravus Ousley</td><br />
<td></td><br />
<td>-5</td><br />
<td>W3z</td><br />
<td>Physics & Admin tools, A working sim.</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:justincc|justincc]]</td><br />
<td>Justin Clark-Casey</td><br />
<td>Lulworth Beaumont</td><br />
<td>Justin Clark-Casey (all other grids)</td><br />
<td>0</td><br />
<td>[http://justincc.org/blog justincc's OpenSim blog]</td><br />
<td>Grid, performance & reliability, inventory (avatar and object), assets, scenes, OARs, etc.</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:DrScofield|drscofld]]</td><br />
<td>Dirk Husemann</td><br />
<td>Dr Scofield</td><br />
<td></td><br />
<td>+1</td><br />
<td>[http://xyzzyxyzzy.net/ xyzzyxyzzy.net]</td><br />
<td>Reliability, networking protocols, inventory, assets, remote control, voice, and pretty much everything else :-)</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:dahlia|dahlia]]</td><br />
<td>T. Hoff</td><br />
<td>Dahlia Trimble</td><br />
<td></td><br />
<td>-8 / -7</td><br />
<td>Independent</td><br />
<td>Collision geometry, various math and physics issues, occasional bug fixes and random enhancements</td><br />
</tr><br />
<tr><br />
<td></td><br />
<td>[[User:Mikem|mikem]]</td><br />
<td>Mike</td><br />
<td><br/></td><br />
<td><br/></td><br />
<td>+9</td><br />
<td>Independent</td><br />
<td>Patches, scripting improvements, LSL compiler</td><br />
</tr><br />
<tr><br />
<td></td><br />
<td>[[User:Melanie_T|Melanie_T]]</td><br />
<td>Melanie</td><br />
<td>Melanie Milland</td><br />
<td><br/></td><br />
<td>+1</td><br />
<td>Independent</td><br />
<td>Scripting, Prims/Scene, Life, The Universe, and Everything</td><br />
</tr><br />
<tr><br />
<td></td><br />
<td>[[User:HomerHorwitz|homerh]]</td><br />
<td>Homer Horwitz</td><br />
<td>Homer Horwitz</td><br />
<td><br/></td><br />
<td>+2</td><br />
<td>Independent</td><br />
<td>Rev. engineering, "now, that's funny" problems, but still interested in all parts of it</td><br />
</tr><br />
<tr><br />
<td></td><br />
<td>[[User:Diva|Diva]]</td><br />
<td>Crista Lopes</td><br />
<td>Diva Canto</td><br />
<td>Crista Lopes / Diva Canto</td><br />
<td>-8</td><br />
<td>University of California, Irvine</td><br />
<td>Everything, except databases</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:nlin|nlin]]</td><br />
<td>N Lin</td><br />
<td>Standard Drucker</td><br />
<td><br/></td><br />
<td>+9</td><br />
<td>[http://www.3di.jp/en/ 3Di Inc, Japan]<br/>http://www.3di.jp/en/</td><br />
<td>Physics, scripting, more to come</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:arthursv|arthursv]]</td><br />
<td>Arthur Valadares</td><br />
<td>Arthur Valadares</td><br />
<td>NONE</td><br />
<td>-3</td><br />
<td>IBM</td><br />
<td>Unit testing, database plugins, bug fixes, general </td><br />
</tr><br />
<br />
</table><br />
<br />
== Retired OpenSim core developers ==<br />
<br />
These people are core developers who have transcended our mortal plane (i.e. they are no longer active).<br />
<br />
<table border="1" cellpadding="2" cellspacing="0" class="sortable"><br />
<tr><br />
<th>Photo </th><br />
<th>IRC Nick </th><br />
<th>Name</th><br />
<th>SL Avatar</th><br />
<th>Other Grid</th><br />
<th>Time Zone<br>(UTC)</th><br />
<th>Org</th><br />
<th>Areas of Interest</th><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:babblefrog|babblefrog]]</td><br />
<td>Brian McBee</td><br />
<td>Dogen Coldstream</td><br />
<td>Babblefrog Ballistic (osgrid)</td><br />
<td>-8</td><br />
<td>Disorganized</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:danx0r|danx0r]]</td><br />
<td>Dan Miller</td><br />
<td>Albert Pascal</td><br />
<td></td><br />
<td>-8</td><br />
<td>squiggle.com</td><br />
<td>PHEEZIKS; everything</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>Tleiades</td><br />
<td>&nbsp;</td><br />
<td>Tleiades&nbsp;Hax</td><br />
<td></td><br />
<td>+1</td><br />
<td>&nbsp;</td><br />
<td>Grid servers/Database</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Darok|Darok]]</td><br />
<td>&nbsp;</td><br />
<td>Darok Kaminski</td><br />
<td></td><br />
<td>+1</td><br />
<td>&nbsp;</td><br />
<td>Physics engines (especially BulletX)</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>Gareth / Gwen</td><br />
<td>Gareth Nelson</td><br />
<td>Gareth Ellison</td><br />
<td>Gareth Nelson (on everywhere but SL)</td><br />
<td>BST (UTC+1)</td><br />
<td>Litesim Ltd</td><br />
<td>Grid servers, sim border crossing, avatar animations</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:dalien|dalien]]</td><br />
<td>Dalien Talbot</td><br />
<td>Dalien Talbot</td><br />
<td></td><br />
<td>+1</td><br />
<td>Mostly TCP-based</td><br />
<td>Small fixes; rev.eng./prototyping; nightlies; git-keeper </td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[Alondria]]</td><br />
<td></td><br />
<td>Alondria LeFay</td><br />
<td>Alondria LeFay (OSGrid)</td><br />
<td>-8</td><br />
<td>Independent</td><br />
<td>Implementation of LSL functions and other scripting tidbits.</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td>[[User:lbsa71|lbsa71]]</td><br />
<td>Stefan Andersson</td><br />
<td>Tribal Skytower</td><br />
<td>OSG:Stefan Andersson<br/>TN:Stefan Andersson</td><br />
<td>+1</td><br />
<td>[http://tribalmedia.se/ Tribal Media AB]</td><br />
<td>Web Integration</td><br />
</tr><br />
</table><br />
<br />
== Additional Developers/Testers/Contributors ==<br />
<br />
These people have contributed bug reports, patches or other contributions to OpenSim. <br> '''New comers please add yourself to bottom of the list!''' <br />
<br />
{| cellspacing="0" cellpadding="2" border="1" class="wikitable sortable"<br />
|-<br />
! IRC Nick <br />
! Name <br />
! SL Avatar <br />
! Other Grid <br />
! Time Zone<br>(UTC) <br />
! Org <br />
! Areas of Interest<br />
|-<br />
| [[User:Nebadon|Nebadon]] <br />
| Michael Cerquoni <br />
| Nebadon Izumi <br />
| Nebadon Izumi <br />
| -7 Arizona <br />
| Oni Kenkon Creations <br />
| Building, Scripting, Testing<br />
|-<br />
| [[User:Jtclark48|jclark4]] <br />
| Jay Clark <br />
| Jay Clarke <br />
| <br />
| -5 <br />
| IBM <br />
| Physics, Grid Host, AI, Scripting, Testing<br />
|-<br />
| [[User:AdamStevenson|BigFootAg]] <br />
| Adam Stevenson <br />
| Adamus Petrov <br />
| <br />
| -6 <br />
| Texas A&amp;M University <br />
| AI, Skynet, Evolving Systems, Biology<br />
|-<br />
| [[User:Jeff1564|Jeff1564]] <br />
| Jeff <br />
| Potter Taurog <br />
| <br />
| -8 <br />
| <br />
| Building, Scripting, Testing<br />
|-<br />
| Rock_Vacirca <br />
| Colin Withers <br />
| Rock Vacirca <br />
| &nbsp; <br />
| +1 <br />
| http://rock-vacirca.blogspot.com <br />
| Testing, building, scripting, maintaining an opensim blog.<br />
|-<br />
| simsim <br />
| caocao <br />
| &nbsp; <br />
| &nbsp; <br />
| +9 <br />
| &nbsp; <br />
| Testing whole functions of OpenSim system,working with OpenSim-Engine,reporting on OpenSim<br />
|-<br />
| [[User:Vicero Lambert|Vicero Lambert]] <br />
| &nbsp; <br />
| &nbsp; <br />
| <br />
| &nbsp; <br />
| &nbsp; <br />
| &nbsp;<br />
|-<br />
| [[User:Magi|Magi]] <br />
| Andy Agnew <br />
| Magi Merlin <br />
| <br />
| +10 <br />
| Spun Pty Ltd <br />
| 3D Web Integration, Database stuff and playing with the odds and ends box.<br />
|-<br />
| [[User:ClarkZone|ClarkZone]] <br />
| Troy Admin(@ClarkZone) <br />
| Troy Childs <br />
| Troy Admin (ClarkZone) <br />
| -5 <br />
| Http://clarkzone.dyndns.org <br />
| Tester and Grid Host<br />
|-<br />
| [[User:Aiaustin|aiaustin]] <br />
| Ai Austin <br />
| Ai&nbsp;Austin <br />
| Ai&nbsp;AIAI&nbsp;(AIAI Grid) <br />
| +0 <br />
| AIAI,&nbsp;University&nbsp;of&nbsp;Edinburgh<br>http://www.aiai.ed.ac.uk/~ai/<br>http://vue.ed.ac.uk/openvue/ <br />
| Windows Vista tests<br>Content testing<br>Use of multiple VWs<br />
|-<br />
| Marc Manders <br />
| Marc Manders <br />
| &nbsp; <br />
| &nbsp; <br />
| +6 <br />
| marcmanders@gmail.com <br />
| Creative features<br />
|-<br />
| [[User:Balthazar|balthazar]] <br />
| Trevor Brooks <br />
| Balthazar Sin <br />
| <br />
| -5 <br />
| None <br />
| Terrains, testing and some small coding tasks<br />
|-<br />
| [[User:Jimbo2120|jimbo2120]] <br />
| Michael Osias <br />
| Illuminous Beltran <br />
| <br />
| -5 <br />
| IBM <br />
| Grid, AI, Skynet, coding and testing<br />
|-<br />
| ZeroPoint <br />
| &nbsp; <br />
| Guilderoy&nbsp;Dench <br />
| <br />
| -5 <br />
| &nbsp; <br />
| Programming/Database<br />
|-<br />
| [[User:DerekTang|DerekTang]] <br />
| Derek Tang <br />
| Derek Timeless <br />
| Derek Tang (ChineseGrid) <br />
| +8 <br />
| http://ChineseGrid.net <br />
| Running a public WINDOWS sim for testing, Docs, Helping Chinese users to enjoy OpenSim; building Chinese OpenSim communities. In construction...<br />
|-<br />
| [[User:TayB|TayB]] <br />
| Earl B <br />
| Taylor Boyau <br />
| <br />
| -10 <br />
| ViziGrid <br />
| Grid Host,Networking,Contributions &amp; Testing.<br />
|-<br />
| [[User:JamieDav|JamieDav]] <br />
| Jamie David <br />
| Jamie David <br />
| <br />
| +7 <br />
| Forum <br />
| Grid, Sim, Avitar, Functionality<br />
|-<br />
| [[User:Krtaylor|Krtaylor]] <br />
| Kurt Taylor <br />
| Kurt Stringer <br />
| <br />
| -6 <br />
| IBM <br />
| Grid, Networking, Monitoring, Scripting, Inventory, Testing<br />
|-<br />
| [[User:Nink|Nink]] <br />
| Peter Finn <br />
| Nink Noonan <br />
| <br />
| -5 <br />
| IBM <br />
| Disruptive Influence.<br />
|-<br />
| [[User:Bruce|Bruce]] <br />
| Bruce Meerson <br />
| Bruce Meerson <br />
| <br />
| +8 <br />
| HiPiHi <br />
| Watching.<br />
|-<br />
| [[User:Darb|DarbD]] <br />
| Brian B. Quinn <br />
| Darb Dabney <br />
| regions<br>near Marin <br />
| PST/SLT (-7 or -8) <br />
| County of Marin, California<br> http://blog.simgis.com <br />
| LiDAR-based sculpties, real-world terrain, <br>pursuit of civic paraverses<br />
|-<br />
| [[CharlieO]] <br />
| Dan <br />
| Charlie Omega <br />
| <br />
| &nbsp; <br />
| &nbsp; <br />
| Mild coding/tweaking/simple feature adds, Stress testing/break stuff, Testing limits of existing code. Making sure [[LSL Status]] is up to date<br />
|-<br />
| oobscure <br />
| &nbsp; <br />
| Opensource Obscure <br />
| <br />
| +1 <br />
| http://www.opensim.it <br />
| Running a public Linux sim for testing, Docs, Helping italian users, Building opensim communities, Watching<br />
|-<br />
| pitman <br />
| Mike Pitman <br />
| Rez Tone <br />
| <br />
| &nbsp; <br />
| IBM <br />
| Scientific visualization schemes, virt world product design, persistant workspaces, virt world based big biz<br />
|-<br />
| cmu <br />
| Christopher Mumme <br />
| Snook Destiny <br />
| <br />
| +1 <br />
| http://www.cmu-develop.de/ and research group "Collaboration Systems and CSCW" at Clausthal University of Technology <br />
| Testing OpenSim, working with OpenSim-Engine, reporting on OpenSim<br />
|-<br />
| [[Silpol]] <br />
| Andriy Tymchenko <br />
| Andy Tir <br />
| <br />
| EET (+2/3) <br />
| http://silpol.blogspot.com/ (also visible at Nokia) <br />
| Highly uncoordinated mess with elements of palace games, under-table diplomacy, rebellion, coup d'état and mutiny. optionally pirate<br />
|-<br />
| [[User:Grumly|Grumly]] <br />
| <br />
| Forest Klaar <br />
| Grumly TheBear <br />
| GMT+1 <br />
| .NET MCAD Dev/Arch/Trainer http://www.devoteam.com <br />
| Trying to get into OpenSim code for now. Particularly interrested in data persistence. blog (Hello, Avatar!): http://lslblog.free.fr<br />
|-<br />
| [[DaTwitch]] <br />
| James G. Stallings II <br />
| <br>Lazarus Longstaff <br />
| Hiro Protagonist (OSGrid) <br />
| -5 <br />
| House Husband <br />
| OSGrid Region owner, OSGrid Operator,<br>Forum Admin, sometime wiki editor<br />
|-<br />
| gryc <br />
| Gryc Ueusp <br />
| Gryc Uriza <br />
| Gryc Uriza(OSGrid) <br />
| -6 <br />
| <br />
| PHP scripting, web interfaces, interconnectivity, cross-platformedness<br />
|-<br />
| [[User:Phrearch|Phrearch]] <br />
| Jeroen van Veen <br />
| Phrearch Miles <br />
| Phrearch Miles(OSGrid) <br />
| Amsterdam/Paris <br />
| <br />
| HWIOS, WiXTD, Wikidoc, Moo, User interfaces<br />
|-<br />
| [[User:Burnman|Burnman]] <br />
| Allen Wilkins <br />
| Burnman Bedlam <br />
| Sid Green (United Grid) <br />
| Boston, USA <br />
| United Grid <br />
| Testing, testing, and more testing! Getting familiar with the source, interested in all aspects of the project.<br />
|-<br />
| [[User:Krisbfunk|krisbfunk]] <br />
| Kris Bulman <br />
| Krisbfunk Vought <br />
| Krisbfunk Nocturnal(OSGrid) <br />
| PE, Canada (-4) <br />
| Edactive Technologies<br>NocturnalEye Productions<br>UPEI <br />
| Currently: Testing, bug reports, wiki updating, building on OSGrid<br />
|-<br />
| [[User:HashBox|HashBox]] <br />
| &nbsp; <br />
| Sibariel Darkstone <br />
| Sibariel Darkstone (OSGrid) <br />
| New Zealand (+12) <br />
| <br />
| Testing, bug reports, and updating the wiki.<br />
|-<br />
| [[User:Kinoc|Kinoc]] <br />
| Kino Coursey <br />
| Daxxon Jaxxon <br />
| Daxxon Kinoc (OSgrid) <br />
| -6 <br />
| Daxtron Laboratories <br> http://www.daxtron.com<br> University of North Texas <br />
| AI, Semantic web, Ontologies, Natural Laanguage Processing, Cyc, Bots, NPC<br />
|-<br />
| [[User:Trapuh|trapuh]] <br />
| Pedro Ribeiro <br />
| Vaiten Forder <br />
| <br />
| GMT <br />
| University Student, Escola Superior de Educação de Viseu, Portugal <br />
| Testing, eventual bug reports and wiki. Music, web/digital arts and php+sql.<br />
|-<br />
| [[User:SonicViz|SonicViz]] <br />
| Paul Cohen <br />
| Komuso Tokugawa <br />
| <br />
| +9 <br />
| Http://sonicviz.com <br />
| Audio/Music, Interactive Music, Control Protocols, Interfaces, VisualFX, Procedural animation/Generative systems + testing and general dev<br />
|-<br />
| [[User:Mokele|mokele]] <br />
| Scott Norman <br />
| Mokelembembe Mokeev <br />
| <br />
| -8 (Southern California) <br />
| Web Developer (PHP and MySQL) <br />
| Interested in seeing running on PowerPC Macs which it is. So, when I can, I'll compile and test on PowerPC Mac (PowerBook G4) and submit reports and then update the wiki if need on installing on Mac. Also have a Ubuntu 7.10 server that I can do testing on too.<br />
|-<br />
| [[User:Devalnor|devalnor]] <br />
| Devalnor <br />
| M. Watkin <br />
| <br />
| +1 (Belgium) <br />
| <br />
| Small Patch code, bug reports, and updating the wiki.<br />
|-<br />
| [[User:Ezekiel|Ezekiel]] <br />
| Ezekiel <br />
| Ezekiel Zabelin <br />
| <br />
| +1 <br />
| http://www.yosims.com <br />
| Concepts, business aspects of virtual worlds - web developer (PHP, MySQL, Javascript, LSL)<br />
|-<br />
| [[User:Buggmaster|Buggmaster]] <br />
| Mike D <br />
| Bug Master <br />
| None <br />
| -8 <br />
| http://www.adultmetaverse.com <br />
| Grid, Data/Web PHP/PERL/MySQL<br />
|-<br />
| [[User:Nixnerd|nixnerd]] <br />
| <br />
| Dangerously Moody <br />
| None <br />
| GMT <br />
| http://www.integratedtechnologies.eu <br />
| Cross Platform Testing, Feedback, Bug Reporting<br />
|-<br />
| [[User:MoHax|mohax]] <br />
| Mo Hax <br />
| Mo Hax <br />
| <br />
| -5 Eastern <br />
| IBM <br />
| Testing, Feedback, Content Contributions, Bug Reporting, Documenting, Development<br />
|-<br />
| [[User:Webmage|webmage]] <br />
| webmage <br />
| Leyla Masala <br />
| Web Mage <br />
| +1 <br />
| IBM <br />
| Testing, terrain<br />
|-<br />
| [[User:NLStitch|NLStitch]] <br />
| Marijn Oosterveld <br />
| Stitch Seale <br />
| NYA <br />
| GMT +1 Amsterdam <br />
| Twingate Systems (http://www.twingate.nl)<br>HanzeHogeschool Groningen, Netherlands <br />
| Programming, Photography, AI<br />
|-<br />
| [[User:Ideia Boa|Ideia Boa]] <br />
| Joao Lopes <br />
| Ideia Boa <br />
| Ideia Boa or Boa Ideia in some grids <br />
| GTM+1 Stockholm/Sweden <br />
| WorldSimTERRA - Virtual World that speaks Portuguese too<br>http://www.worldsimterra.com <br />
| Testing and more testing! Updating the original wiki and translating the OpenSim Wiki into Portuguese and reporting on OpenSim<br />
|-<br />
| [[User:Lulurun|lulurun]] <br />
| liu <br />
| <br> <br />
| <br> <br />
| +9 <br />
| 3Di Inc, Japan <br>http://www.3di.jp <br />
| Patches, openid, server performance, UGAI<br />
|-<br />
| [[User:Carlosroundel|Carlosrounde]] <br />
| Carlosroundel <br />
| Carlos Roundel <br />
| <br> <br />
| +1 <br />
| Cyberlandia Italy<br>http://www.cyberlandia.net <br />
| Grid, programmer, database, tester<br />
|-<br />
| [[User:Mikebert|Mikebert]] <br />
| Michael Strunck <br />
| Mikebert Miles <br />
| Mikebert M34 <br />
| +1 <br />
| OpenSIM Wiki, Germany<br>http://www.opensim.de <br />
| German Wiki, Translater, Server Performance (Linux/Windows), Tester, Feedback, Bug Reporting, Server-Hosting<br />
|-<br />
| [[User:Fly-man-|Fly-Man-]] <br />
| Laurence <br />
| <br />
| Fly Man <br />
| +1 <br />
| <br />
| Testing, OpenSimSearch, OpenSimProfile<br />
|-<br />
| Taoki <br />
| Mircea Kitsune / Taoki Vixen <br />
| Mircea Kitsune (OSGrid) / Mircea Lobo (LL grid) <br />
| <br> <br />
| GMT +2 <br />
| <br> <br />
| Usually testing and bug reporting but I also make smaller patches where I know what to do.<br />
|-<br />
| [[User:Patnad|Patnad]] <br />
| Patrick <br />
| Patnad Babii <br />
| Patnad Babii (OSGrid) <br />
| GMT -5 <br />
| RezzMe Technologies<br>http://www.rezzme.com <br />
| Bug testing and reporting, I code C# and have submitted a few patches<br />
|-<br />
| [[User:Hallow Palmer|Hallow Palmer]] <br />
| Markus <br />
| Hallow Palmer <br />
| <br> <br />
| +1 <br />
| Grid4Us<br>http://www.grid4us.net <br />
| Server Performance (Windows), Tester, Feedback, Business concepts,Bug Reporting, Server-Hosting<br />
|-<br />
| [[User:^DarkMan|^DarkMan]] <br />
| Brian Adair <br />
| Patrick Ouachita <br />
| Brian Adair &#124; Patrick Meta <br />
| -6 CST <br />
| RealMetaLife &#124; B&amp;H Networking <br />
| Building, Scripting, Testing, etc.<br />
|-<br />
| [[User:Tlaukkan|Tommi Laukkanen]] <br />
| Tommi Laukkanen <br />
| &nbsp; <br />
| Tommi Laukkanen <br />
| +2 GMT <br />
| http://www.bubblecloud.org <br />
| Protocols ([http://www.bubblecloud.org MXP]), NHibernate, Scrip API, Map Generation, Bug Fixes, Grid Hosting<br />
|-<br />
| [[User:Mystical|Mystical]] <br />
| Kevin Tweedy <br />
| Mystical Demina <br />
| Mystical Demina <br />
| -5 <br />
| Extreme Reality Grid<br>http://www.XRGrid.com <br />
| Windows Communication Framework, Windows Workflow,Entity Framework, MSSQL<br>Enhancements,Commerce, Content,DotNetNuke based portal, development services<br />
|-<br />
| [[User:Godfrey|Godfrey]] <br />
| Jeff Lee <br />
| Warin Cascabel <br />
| <br />
| -5 (EST5EDT) <br />
| <br />
| Testing, minor bugfixes. Scripting, building, animating<br />
|-<br />
| Jamenai <br />
| Christopher Händler <br />
| Jamenai Luik <br />
| Jamenai Luik <br />
| +1 <br />
| Playneko Grid &#124; XIMDEX Jamenai<br>http://www.playneko.de<br>http://www.ximdex.de <br />
| Performance,Bug Reporting, Hosting, Grid-Owner,(PHP, MySQL, Perl, JavaScript, LSL)<br />
|-<br />
| [[User:Bikcmp|bikcmp]] <br />
| Jason <br />
| Jake1500 Allen <br />
| Jason Helios (The Helios Grid) <br />
| EST <br />
| Blue Software <br />
| Search, groups, land, and currency<br />
|-<br />
| [[User:Mark.malewski|Slipaway]] <br />
| Mark Malewski <br />
| Chris Rock <br />
| <br />
| -6 (-5 during summer - CDT) <br />
| NexTECH / Joopla <br />
| Web development &amp; systems integration, terrain, WIKI documentation, tutorials, testing, bug reporting and feedback.<br />
|-<br />
| barakademi <br />
| Steve Topp <br />
| barakademi Barzane <br />
| same avi on baragrid OSgrid Grid4us sciencesim <br />
| utc+1 (CET) paris <br />
| http://xbot-sl.barakademi.org http://vps.barakademi.org/oswi http://vps.barakademi.org/oswi/loginscreen.php <br />
| Music LiveMusic MetaverseMusic Opensim Libomv Mono-2.4 Linux (suse,debian,ubuntu) Admin Scripting Automating Development Intergration php mysql bash nant +++<br />
|-<br />
| [[User:RemedyTomm|RemedyTomm]] <br />
| Tom Grimshaw <br />
| Tomm Remedy <br />
| KGrid: Casper Warden OSGrid: Tomm Remedy <br />
| UTC+0 (BST) <br />
| Remedy Communications <br />
| Texture pipeline, Groups, ObjectUpdates<br />
|-<br />
| [[User:Robert d|robert_d]] <br />
| Robert Dzikowski <br />
| <br />
| OSGrid: robert_d 13 <br />
| UTC+1 <br />
| [http://blog.rd-it.net http://blog.rd-it.net] <br />
| Region Modules, Tutorials<br />
|-<br />
| [[User:Snoopy2|Snoopy2]] <br />
| Snoopy Pfeffer <br />
| Snoopy Pfeffer <br />
| Snoopy Pfeffer <br />
| <br />
| [http://www.3dmetaverse.com/ http://www.3dmetaverse.com/] <br />
| Region Hosting, Open Metaverse, 3D Web, server and viewers, service management<br />
|-<br />
| john_ <br />
| John&nbsp;Moyer <br />
| VAJohn&nbsp;GeekSquad or&nbsp;Matthew&nbsp;Kendal <br />
| <br />
| -5 <br />
| Best&nbsp;Buy/Geek&nbsp;Squad <br />
| Tester<br />
|-<br />
| [[User:W!cKeD|_WicKeD]] <br />
| Maik <br />
| Maik Galaxy <br />
| El Diablo <br />
| +1 Germany <br />
| Creatio Inc. / [http://www.OpenSimGerman.us/ OpenSimGerman.us] <br />
| German Support, Translator, Building, Scripting, Testing, Hosting<br />
|-<br />
| [[User:Stevie Wakowski|Stevie Wakowksi]] <br />
| Steve Roberts <br />
| Stevie Wakowski <br />
| <br />
| +10 Australia <br />
| IBM <br />
| OpenSim builds, Linux, Modrex, bug reporting, evangalist for OpenSim in business applications.<br><br />
|}<br />
<br />
[[Category:Main]] [[Category:Development]] [[Category:Tech_Reference]] [[Category:Help]]</div>DrScofieldhttp://opensimulator.org/wiki/Automated_TestingAutomated Testing2009-10-01T13:29:23Z<p>DrScofield: Updating to refer to dear panda (instead of that bamboo stuff)</p>
<hr />
<div>__NOTOC__<br />
{{Template:Quicklinks}}<br />
<br />
As OpenSim matures, we are extremely interested in adding more automated verification into the OpenSim source tree. Testing exists not only to prevent bugs from creeping in, but also to provide fair warning that the behavior of the system has changed, and tests may need updating.<br />
<br />
In OpenSim today we use NUnit tests. Our conventions are:<br />
# Tests should '''not''' exist inside runtime assemblies, as this makes nunit a production requirement<br />
# Tests should be in .Tests.dll assemblies. For instance, the tests for OpenSim.Data.SQLite.dll should be in the OpenSim.Data.SQLite.Tests.dll assembly. This allows for easy removal of test assemblies in products.<br />
# Tests should be as close to the code as possible, but not intermingled. So the tests for OpenSim/Data/SQLite should be in OpenSim/Data/SQLite/Tests/. Through the use of the '''Exclude''' keyword in prebuild.xml you can ensure that directory is part of OpenSim.Data.SQLite.Tests.dll and not OpenSim.Data.SQLite.dll. See exclude clarification in writing unit tests section.<br />
# Tests testing a class should be grouped into a test class file called xxxTest.cs, where xxx is the name of the class that is being tested.<br />
# Tests should be able to run safely in a production environment. That means that care must be taken not to damage data on the machine that it is being run.<br />
# Tests should be deterministic in other words repeatable. Avoid randomness in tests. See good and bad testing practices below.<br />
<br />
== Core Functionality Missing Unit Tests ==<br />
<br />
This is a list of functionality which is not covered by unit tests and is identified as highly desireable test target:<br />
<br />
# Database Modules (These are mysql tables)<br />
## region ban<br />
## land<br />
## landaccesslist<br />
<br />
== Good / Bad Test practices ==<br />
Creating good tests is an art, not a science. Tests are useful by how many bugs they find or how many bugs they avoid. Things you should think about in creating good tests is:<br />
* Throwing edge cases, like 0, "", or Null at parameters. This ensures that people functions are hardened against incomplete data. Many of our crashes come from the lack of this hardening showing up at just the wrong time.<br />
* Use stateful testing to build up complex scenarios. This is more useful than just cursory get / set calls.<br />
* Random tests are not a good idea. We need test results to be deterministic. In other words tests need to be repeatable. If you want to test for a range it is good idea to make separate tests for min and max values. Random values in fields can fail randomly. When something goes wrong for example in database schema the developer will not necessarily notice if the stored values are random. On the other hand its hard to troubleshoot randomly failing tests as you dont know which specific value caused the failure.<br />
* Tests should be independent and should not rely on another test being run, passing or failing. An excerpt from [http://xunitpatterns.com/Principles%20of%20Test%20Automation.html#Independent%20Test xUnit Patterns]:<br />
<blockquote>If tests are interdependent and (even worse) order dependent, we will be depriving ourselves of the useful feedback test failures provide. Interacting Tests [...] tend to fail in a group. The failure of a test that moved the [subject under test] into the state required by the dependent test will lead to the failure of the dependent test too. With both tests failing, how can we tell if it is because of a problem in code that both rely on in some way or is it a problem in code that only the first relies on. With both tests failing we can't tell. We are only talking about two tests here. Imagine how much worse this is with tens or hundreds of tests.</blockquote><br />
* Only one function of the subject under test should be tested in one test. When testing a database access object, for example, write separate tests for creating DB entries, updating them and removing them.<br />
* Do not use the subject under test to set up the state for the test or to verify the result. Use a different method. When testing a database access object, for example, use raw SQL to insert the initial data into the DB, then run the method being tested. To verify if the operation was successful, use raw SQL again to verify the DB changed as expected.<br />
* Use descriptive asserts whenever you can. All you have to do is add an extra , to the Assert() method and write a string that will show when that test fails. For example:<br />
Assert.That(i,Is.EqualTo(5),"i is not equal to 5! in Example.Test1()");<br />
* When a test fails due to a uncaught exception, such as NullReference, nUnit does not report where it happened, leaving debuggers clueless. A good practive is to write something on the start of every test in your test file. This way if an exception is raised, someone could read the last lines written and see at least in what test it failed. Luckily, this routine is already implemented in OpenSim.Tests.Common.TestHelper InMethod().<br />
<br />
== Writing Tests ==<br />
<br />
See [http://www.nunit.org/index.php?p=quickStart&r=2.4 NUnit Quick Start] for an introduction to unit testing with NUnit.<br />
<br />
Writing a new unit test is pretty easy, and very helpful in increasing the stability of opensim by nailing down bugs. I'm going to present an example here of SQLite Asset testing to show how simple such a test case is to write. The actual in tree SQLite Asset tests are a little different because the code was factored out so that it was easily applied to any database driver, so don't be concerned with the fact that what you see here isn't in the tree.<br />
<br />
Exclude clarification: Make sure your master project (not the test project) has an entry for files like the following so that the test code is not included in the master project dll:<br />
<br />
<pre><br />
<Files><br />
<Match pattern="*.cs" recurse="true"><br />
<Exclude name="Tests" pattern="Tests" /><br />
</Match><br />
</Files><br />
</pre><br />
<br />
=== NUnit Conventions ===<br />
An NUnit test suite:<br />
* is a class with a default constructor (takes no arguments)<br />
* has public methods that are tests<br />
* uses annotations to determine what are tests<br />
* runs it's tests in '''alphabetical order by method name'''<br />
<br />
An NUnit test method:<br />
* must be public<br />
* must return void<br />
* must take no arguments<br />
* is successful if no exception or assert is thrown while running it<br />
<br />
The run order is important if you want to have early tests that setup some complicated state (like creating objects), and have later tests remove or update that state. For that reason I find it very helpful to name all test methods '''Txxx_somename''' where '''xxx''' is a number between 000 and 999. That guaruntees no surprises in run order.<br />
<br />
=== Fixture Setup / Teardown ===<br />
<br />
See [[Example Test SQLite Assets]] for this code snipped in context. <br />
<br />
<source lang="csharp"><br />
[TestFixtureSetUp]<br />
public void Init()<br />
{<br />
uuid1 = UUID.Random();<br />
uuid2 = UUID.Random();<br />
uuid3 = UUID.Random();<br />
name1 = "asset one";<br />
name2 = "asset two";<br />
name3 = "asset three";<br />
<br />
asset1 = new byte[100];<br />
asset1.Initialize();<br />
file = Path.GetTempFileName() + ".db";<br />
connect = "URI=file:" + file + ",version=3";<br />
db = new SQLiteAssetData();<br />
db.Initialise(connect);<br />
}<br />
<br />
[TestFixtureTearDown]<br />
public void Cleanup()<br />
{<br />
db.Dispose();<br />
System.IO.File.Delete(file);<br />
}<br />
</source><br />
<br />
In the case of testing something like the database layer, we have to actually attempt to store / retrieve things from a database. Following from rule #4 of good tests, we want to make sure not to touch the production databases to run our tests, so during startup we generate a temporary file name which is guaranteed not to be an existing file on the system, and use that as our database file name. By running db.Initialize() the OpenSim migration code will correctly populate that database with the latest schema.<br />
<br />
Once we are done with the tests we want to make sure we aren't leaving garbage temp files on the user's system. So we remove that file we created.<br />
<br />
During setup we also create a set of state variables, such as 3 uuids, 3 strings, and a data block. You could have always just stuck these inline, but variables are there for a reason, so use them.<br />
<br />
=== Test Setup / Teardown ===<br />
<br />
What's missing in [[Example Test SQLite Assets]] are individual test Setup and Teardown methods. These methods allow each test to be completely self sufficient without the code duplication needed to set up the test environment at the start of each test.<br />
<br />
Let's assume the <code>SQLiteAssetData</code> class provided a <code>FetchAsset()</code> method and a <code>UpdateAsset()</code> method. Since every test should be independent of any other test, and <code>FetchAsset()</code> and <code>UpdateAsset()</code> should be tested in separate tests, that means each test would need to create its own entries in the asset table in order to succeed. You may have something like this (see [[Example Test SQLite Assets#This Test is Flawed|Example Test SQLite Assets]] for an explanation of <code>sqldb.executeSQL()</code>):<br />
<br />
<source lang="csharp">[Test]<br />
public void T101_TestFetchAsset()<br />
{<br />
AssetBase a1 = new AssetBase(...);<br />
sqldb.executeSQL("INSERT INTO assets VALUES({0}, ...)", a1.uuid, ...);<br />
<br />
AssetBase a1_actual = db.FetchAsset(a1.uuid);<br />
<br />
Assert.Equal(a1_actual.uuid, a1.uuid);<br />
Assert.Equal(a1_actual.Name, a1.Name);<br />
// etc<br />
}<br />
<br />
[Test]<br />
public void T103_TestUpdateAsset()<br />
{<br />
AssetBase a1 = new AssetBase(...);<br />
sqldb.executeSQL("INSERT INTO assets VALUES({0}, ...)", a1.uuid, ...);<br />
<br />
a1.Name = "new name";<br />
<br />
db.UpdateAsset(a1.uuid, a1);<br />
<br />
AssetBase a1_actual = sqldb.executeSQL("SELECT * FROM assets WHERE uuid = {0}", a1.uuid);<br />
<br />
Assert.Equal(a1_actual.uuid, a1.uuid);<br />
Assert.Equal(a1_actual.Name, a1.Name);<br />
// etc<br />
}<br />
</source><br />
<br />
You will note that both tests have the same code at the top in which they create an entry in the assets table. This duplicate code can be factored out into a Setup method, which is called before every test is executed (assume <code>a1</code> is a class attribute):<br />
<br />
<source lang="csharp"><br />
[SetUp]<br />
public void SetUp()<br />
{<br />
a1 = new AssetBase(...);<br />
sqldb.executeSQL("INSERT INTO assets VALUES({0}, ...)", a1.uuid, ...);<br />
}<br />
<br />
[TearDown]<br />
public void TearDown()<br />
{<br />
// clean up after ourselves so the next test has a clean DB to start with<br />
sqldb.executeSQL("DELETE FROM assets");<br />
}<br />
<br />
[Test]<br />
public void T101_TestFetchAsset()<br />
{<br />
AssetBase a1_actual = db.FetchAsset(a1.uuid);<br />
<br />
Assert.Equal(a1_actual.uuid, a1.uuid);<br />
Assert.Equal(a1_actual.Name, a1.Name);<br />
// etc<br />
}<br />
<br />
[Test]<br />
public void T103_TestUpdateAsset()<br />
{<br />
a1.Name = "new name";<br />
<br />
db.UpdateAsset(a1.uuid, a1);<br />
<br />
AssetBase a1_actual = sqldb.executeSQL("SELECT * FROM assets WHERE uuid = {0}", a1.uuid);<br />
<br />
Assert.Equal(a1_actual.uuid, a1.uuid);<br />
Assert.Equal(a1_actual.Name, a1.Name);<br />
// etc<br />
}<br />
</source><br />
<br />
Also note the <code>TearDown()</code> method; it is called after each test has run, regardless whether the test passed or failed. It deletes all the entries in the <code>assets</code> table so that there is no leftover data in the database to interfere with the next test.<br />
<br />
==== Multiple Setup Methods ====<br />
<br />
Not all setup and teardown must happen in methods declared [SetUp] and [TearDown]. It may be useful to provide methods which perform part of the setup and to call them from whichever test may need it:<br />
<br />
<source lang="csharp"><br />
private AssetBase InsertAssetWithRandomData(UUID assetUuid)<br />
{<br />
AssetBase asset = new AssetBase(assetUuid);<br />
asset.Name = somethingRandom();<br />
asset.Data = somethingRandom();<br />
<br />
sqldb.executeSQL("INSERT INTO assets VALUES({0}, ...)", asset.uuid, ...);<br />
<br />
return asset;<br />
}<br />
<br />
[Test]<br />
public void T201_TestNeedsTwoAssets()<br />
{<br />
AssetBase a1 = InsertAssetWithRandomData(uuid1);<br />
AssetBase a2 = InsertAssetWithRandomData(uuid2);<br />
// etc<br />
}<br />
<br />
[Test]<br />
public void T203_TestNeedsFiveAssets()<br />
{<br />
AssetBase a1 = InsertAssetWithRandomData(uuid1);<br />
AssetBase a2 = InsertAssetWithRandomData(uuid2);<br />
AssetBase a3 = InsertAssetWithRandomData(uuid3);<br />
AssetBase a4 = InsertAssetWithRandomData(uuid4);<br />
AssetBase a5 = InsertAssetWithRandomData(uuid5);<br />
// etc<br />
}<br />
</source><br />
<br />
Notice that <code>InsertAssetWithRandomData</code> is <code>private</code> as it's only called from within the class.<br />
<br />
=== Asserts ===<br />
You will see scattered through the code '''Assert.That(...)'''. These will throw an exception if the condition is not valid. This format of assertions is called the [http://www.nunit.org/index.php?p=constraintModel&r=2.4 Constraint Model] in NUnit, and provides a large number of tests with the flavor of:<br />
* Assert.That(foo, Is.Null)<br />
* Assert.That(foo, Is.Not.Null)<br />
* Assert.That(foo, Is.True)<br />
* Assert.That(foo, Is.EqualTo(bar))<br />
* Assert.That(foo, Text.Matches( "*bar*" ))<br />
<br />
Of note, Is.EqualTo uses the Equals function of foo, so this can only be used on objects that are IComparable. Most of the OpenSim base objects are not, so you'll have to compare fields manually in tests.<br />
<br />
For the complete set of conditions you can use see [http://www.nunit.org/index.php?p=constraintModel&r=2.4 the Constraint Model NUnit documentation]. While there is another syntax for tests, the Constraint Model is preferred as it is far more human readable.<br />
<br />
=== Simple Negative Tests ===<br />
<br />
See [[Example Test SQLite Assets]] for this code snipped in context.<br />
<br />
<source lang="csharp">[Test]<br />
public void T001_LoadEmpty()<br />
{<br />
Assert.That(db.ExistsAsset(uuid1), Is.False);<br />
Assert.That(db.ExistsAsset(uuid2), Is.False);<br />
Assert.That(db.ExistsAsset(uuid3), Is.False);<br />
}<br />
</source><br />
<br />
Test T001 is an example of a simple negative test. We assume a new database will not have any of those assets in them. While the value of this test may look low, it does provide a baseline in ensuring that the database connection is there, that these return false correctly, and that no other exception is thrown. Negative tests are a good way to force bounds conditions and ensure that not only does it ''return what you expect'' it also ''doesn't return what you don't expect''. Thought of another way, it ensures your code is somewhat defensive in nature, not coughing on bad or unexpected data.<br />
<br />
=== Simple Positive Tests ===<br />
<br />
See [[Example Test SQLite Assets]] for this code snipped in context.<br />
<br />
<source lang="csharp"><br />
[Test]<br />
public void T010_StoreSimpleAsset()<br />
{<br />
AssetBase a1 = new AssetBase(uuid1, name1);<br />
AssetBase a2 = new AssetBase(uuid2, name2);<br />
AssetBase a3 = new AssetBase(uuid3, name3);<br />
a1.Data = asset1;<br />
a2.Data = asset1;<br />
a3.Data = asset1;<br />
<br />
db.CreateAsset(a1);<br />
db.CreateAsset(a2);<br />
db.CreateAsset(a3);<br />
<br />
AssetBase a1a = db.FetchAsset(uuid1);<br />
Assert.That(a1a.ID, Is.EqualTo(uuid1));<br />
Assert.That(a1a.Name, Is.EqualTo(name1));<br />
<br />
AssetBase a2a = db.FetchAsset(uuid2);<br />
Assert.That(a2a.ID, Is.EqualTo(uuid2));<br />
Assert.That(a2a.Name, Is.EqualTo(name2));<br />
<br />
AssetBase a3a = db.FetchAsset(uuid3);<br />
Assert.That(a3a.ID, Is.EqualTo(uuid3));<br />
Assert.That(a3a.Name, Is.EqualTo(name3));<br />
}<br />
</source><br />
T010 is an example of a simple positive test. In it we create and store 3 assets (ensuring no exceptions), then load those 3 assets back from the database and ensure the fields are correct. Because AssetBase is not IComparible we just check the ID and Name fields with equals tests. If any of the Asserts fail, the whole test fails.<br />
<br />
=== Stateful Tests ===<br />
<br />
See [[Example Test SQLite Assets]] for this code snipped in context.<br />
<br />
<source lang="csharp"><br />
[Test]<br />
public void T011_ExistsSimpleAsset()<br />
{<br />
Assert.That(db.ExistsAsset(uuid1), Is.True);<br />
Assert.That(db.ExistsAsset(uuid2), Is.True);<br />
Assert.That(db.ExistsAsset(uuid3), Is.True);<br />
}<br />
</source><br />
<br />
T011 is an example of a stateful test, because it requires the state created by T010 (i.e. the creation of those 3 objects). In order to test any kind of complicated scenario you will find that you need to use stateful tests to build up various amounts of state (testing along the way), then manipulating and possibly tearing it down. Without doing this you can't do truly deep testing of function in any complex environment. This example isn't very stateful (I tried to pick an easy example), but it should give you some ideas.<br />
<br />
=== Speculative Tests ===<br />
Speculative tests are tests that might or might not apply in a given situation. MySQL testing in the OpenSim tree is done by speculative testing, the tests will only run if there is a properly configured database, otherwise they will not be run. If you execute '''Assert.Ignore()''' in a '''Test''' the test will end and be ignored. If you run '''Assert.Ignore()''' in the '''TestFixtureSetup''' all tests in the test fixture will be skipped and ignored.<br />
<br />
Speculative testing lets you create tests that require certain preconditions to be met which you can't guarantee on all platforms/configuration, and are an important part of deep testing.<br />
<br />
== Adding Tests to the Tree ==<br />
As we said previously all tests for assembly OpenSim.Foo (in directory OpenSim/Foo) should:<br />
* be in assembly OpenSim.Foo.Tests.dll<br />
* not be in the OpenSim.Foo.dll assembly<br />
* be in OpenSim/Foo/Tests directory<br />
<br />
Also, if you have created a new test assembly you must add references<br />
to it in ''.nant/local.include'', both to the <br />
* ''test'' target, and the<br />
* ''test-xml'' target<br />
to ensure that the assembly is added to the automated panda runs as<br />
well as the nant ''test'' target.<br />
<br />
== Executing Tests ==<br />
<br />
=== Panda ===<br />
On every commit to opensim all the tests are run on the [http://panda.opensimulator.org/ panda build server on opensimulator.org]. The process takes about 5 minutes to build, test, and report the results back out on #opensim-dev via the osmantis bot.<br />
<br />
=== Nant ===<br />
You can manually run all the tests for OpenSim on your system by running '''nant test''' as a nant target. This will run all the tests that are in the tree, though some speculative tests might be ignored if your platform does not have the right features or configuration to run these tests.<br />
<br />
=== NUnit Console ===<br />
If you only want to run tests for one assembly you can do that using the NUnit Console. On Linux just run '''nunit-console2 OpenSim.Foo.Tests.dll''' and it will run only the tests for OpenSim.Foo.Tests.dll. If you are only making changes to 1 dll and just want a quick sanity check, this is the fastest way to do that.<br />
<br />
=== Debugging Tests ===<br />
There is a special page dedicated to this. See [[Debugging Unit Tests]].<br />
<br />
== Learning More ==<br />
You should definitely read the documentation at the [http://www.nunit.org/index.php?p=documentation NUnit homepage] if you want to know more about testing. It's a very good reference for all the APIs in NUnit that you can use for creating tests.<br />
<br />
== Code Coverage ==<br />
<br />
A prototype has been included using monocov, which has a profile built-in in mono. Instructions for using monocov can be found on the Mono homepage, in [http://www.mono-project.com/Code_Coverage Code Coverage] section. Unfortunately nunit2 and nant do not support code coverage with monocov (only some other proprietary code coverages), so there is no <monocov> tag. The solution was to implement it using many nunit-console and on <exec> tags. <br />
<br />
ATTENTION: Code coverage only works with mono 1.2.x , any other version will most likely not work. Code coverage development is being put on hold for now until it supports newer mono versions.<br />
<br />
=== Running ===<br />
<br />
Download [http://primates.ximian.com/~lupus/monocov-0.2.tar.gz monocov] and [http://prdownloads.sourceforge.net/nunit/NUnit-2.4.8-net-2.0.zip?download nunit-console] if your nunit-console does not work. To test if it works (my Ubuntu's Hardy version did not), just run one of the tests with nunit-console.<br />
<br />
Install monocov (./configure, ./make install, there could be some minor conflicts, I had to add to the compiling line -I/usr/include/mono-1.0/) and make sure the working nunit-console.exe is in /usr/lib/nunit/nunit-console.exe. Now just run nant test-cov and it will generate .cov files and HTML directories in the cov directory. The .cov files can be seen by running monocov on them, and have the same information as the HTML directories.<br />
<br />
== Testing Todo ==<br />
<br />
=== Coverage ===<br />
<br />
A prototype has been done and documented. Now we must keep a look if monocov will evolve to support newer mono versions.<br />
<br />
[[Category:Development]]<br />
[[Category:Testing]]<br />
<br />
== Links to More Information on Unit Testing ==<br />
<br />
* [http://www.nunit.org/index.php?p=quickStart&r=2.4 NUnit Quick Start]<br />
* [http://xunitpatterns.com/ xUnit Patterns book homepage], with lots of information on good practices, patterns, code smells, etc.<br />
* There is a lot of information on unit testing at the [http://c2.com/cgi/wiki?search=unittest Cunningham & Cunningham, Inc wiki at c2.com]</div>DrScofieldhttp://opensimulator.org/wiki/Automated_TestingAutomated Testing2009-10-01T13:26:34Z<p>DrScofield: updating instructions on how to add testcases</p>
<hr />
<div>__NOTOC__<br />
{{Template:Quicklinks}}<br />
<br />
As OpenSim matures, we are extremely interested in adding more automated verification into the OpenSim source tree. Testing exists not only to prevent bugs from creeping in, but also to provide fair warning that the behavior of the system has changed, and tests may need updating.<br />
<br />
In OpenSim today we use NUnit tests. Our conventions are:<br />
# Tests should '''not''' exist inside runtime assemblies, as this makes nunit a production requirement<br />
# Tests should be in .Tests.dll assemblies. For instance, the tests for OpenSim.Data.SQLite.dll should be in the OpenSim.Data.SQLite.Tests.dll assembly. This allows for easy removal of test assemblies in products.<br />
# Tests should be as close to the code as possible, but not intermingled. So the tests for OpenSim/Data/SQLite should be in OpenSim/Data/SQLite/Tests/. Through the use of the '''Exclude''' keyword in prebuild.xml you can ensure that directory is part of OpenSim.Data.SQLite.Tests.dll and not OpenSim.Data.SQLite.dll. See exclude clarification in writing unit tests section.<br />
# Tests testing a class should be grouped into a test class file called xxxTest.cs, where xxx is the name of the class that is being tested.<br />
# Tests should be able to run safely in a production environment. That means that care must be taken not to damage data on the machine that it is being run.<br />
# Tests should be deterministic in other words repeatable. Avoid randomness in tests. See good and bad testing practices below.<br />
<br />
== Core Functionality Missing Unit Tests ==<br />
<br />
This is a list of functionality which is not covered by unit tests and is identified as highly desireable test target:<br />
<br />
# Database Modules (These are mysql tables)<br />
## region ban<br />
## land<br />
## landaccesslist<br />
<br />
== Good / Bad Test practices ==<br />
Creating good tests is an art, not a science. Tests are useful by how many bugs they find or how many bugs they avoid. Things you should think about in creating good tests is:<br />
* Throwing edge cases, like 0, "", or Null at parameters. This ensures that people functions are hardened against incomplete data. Many of our crashes come from the lack of this hardening showing up at just the wrong time.<br />
* Use stateful testing to build up complex scenarios. This is more useful than just cursory get / set calls.<br />
* Random tests are not a good idea. We need test results to be deterministic. In other words tests need to be repeatable. If you want to test for a range it is good idea to make separate tests for min and max values. Random values in fields can fail randomly. When something goes wrong for example in database schema the developer will not necessarily notice if the stored values are random. On the other hand its hard to troubleshoot randomly failing tests as you dont know which specific value caused the failure.<br />
* Tests should be independent and should not rely on another test being run, passing or failing. An excerpt from [http://xunitpatterns.com/Principles%20of%20Test%20Automation.html#Independent%20Test xUnit Patterns]:<br />
<blockquote>If tests are interdependent and (even worse) order dependent, we will be depriving ourselves of the useful feedback test failures provide. Interacting Tests [...] tend to fail in a group. The failure of a test that moved the [subject under test] into the state required by the dependent test will lead to the failure of the dependent test too. With both tests failing, how can we tell if it is because of a problem in code that both rely on in some way or is it a problem in code that only the first relies on. With both tests failing we can't tell. We are only talking about two tests here. Imagine how much worse this is with tens or hundreds of tests.</blockquote><br />
* Only one function of the subject under test should be tested in one test. When testing a database access object, for example, write separate tests for creating DB entries, updating them and removing them.<br />
* Do not use the subject under test to set up the state for the test or to verify the result. Use a different method. When testing a database access object, for example, use raw SQL to insert the initial data into the DB, then run the method being tested. To verify if the operation was successful, use raw SQL again to verify the DB changed as expected.<br />
* Use descriptive asserts whenever you can. All you have to do is add an extra , to the Assert() method and write a string that will show when that test fails. For example:<br />
Assert.That(i,Is.EqualTo(5),"i is not equal to 5! in Example.Test1()");<br />
* When a test fails due to a uncaught exception, such as NullReference, nUnit does not report where it happened, leaving debuggers clueless. A good practive is to write something on the start of every test in your test file. This way if an exception is raised, someone could read the last lines written and see at least in what test it failed. Luckily, this routine is already implemented in OpenSim.Tests.Common.TestHelper InMethod().<br />
<br />
== Writing Tests ==<br />
<br />
See [http://www.nunit.org/index.php?p=quickStart&r=2.4 NUnit Quick Start] for an introduction to unit testing with NUnit.<br />
<br />
Writing a new unit test is pretty easy, and very helpful in increasing the stability of opensim by nailing down bugs. I'm going to present an example here of SQLite Asset testing to show how simple such a test case is to write. The actual in tree SQLite Asset tests are a little different because the code was factored out so that it was easily applied to any database driver, so don't be concerned with the fact that what you see here isn't in the tree.<br />
<br />
Exclude clarification: Make sure your master project (not the test project) has an entry for files like the following so that the test code is not included in the master project dll:<br />
<br />
<pre><br />
<Files><br />
<Match pattern="*.cs" recurse="true"><br />
<Exclude name="Tests" pattern="Tests" /><br />
</Match><br />
</Files><br />
</pre><br />
<br />
=== NUnit Conventions ===<br />
An NUnit test suite:<br />
* is a class with a default constructor (takes no arguments)<br />
* has public methods that are tests<br />
* uses annotations to determine what are tests<br />
* runs it's tests in '''alphabetical order by method name'''<br />
<br />
An NUnit test method:<br />
* must be public<br />
* must return void<br />
* must take no arguments<br />
* is successful if no exception or assert is thrown while running it<br />
<br />
The run order is important if you want to have early tests that setup some complicated state (like creating objects), and have later tests remove or update that state. For that reason I find it very helpful to name all test methods '''Txxx_somename''' where '''xxx''' is a number between 000 and 999. That guaruntees no surprises in run order.<br />
<br />
=== Fixture Setup / Teardown ===<br />
<br />
See [[Example Test SQLite Assets]] for this code snipped in context. <br />
<br />
<source lang="csharp"><br />
[TestFixtureSetUp]<br />
public void Init()<br />
{<br />
uuid1 = UUID.Random();<br />
uuid2 = UUID.Random();<br />
uuid3 = UUID.Random();<br />
name1 = "asset one";<br />
name2 = "asset two";<br />
name3 = "asset three";<br />
<br />
asset1 = new byte[100];<br />
asset1.Initialize();<br />
file = Path.GetTempFileName() + ".db";<br />
connect = "URI=file:" + file + ",version=3";<br />
db = new SQLiteAssetData();<br />
db.Initialise(connect);<br />
}<br />
<br />
[TestFixtureTearDown]<br />
public void Cleanup()<br />
{<br />
db.Dispose();<br />
System.IO.File.Delete(file);<br />
}<br />
</source><br />
<br />
In the case of testing something like the database layer, we have to actually attempt to store / retrieve things from a database. Following from rule #4 of good tests, we want to make sure not to touch the production databases to run our tests, so during startup we generate a temporary file name which is guaranteed not to be an existing file on the system, and use that as our database file name. By running db.Initialize() the OpenSim migration code will correctly populate that database with the latest schema.<br />
<br />
Once we are done with the tests we want to make sure we aren't leaving garbage temp files on the user's system. So we remove that file we created.<br />
<br />
During setup we also create a set of state variables, such as 3 uuids, 3 strings, and a data block. You could have always just stuck these inline, but variables are there for a reason, so use them.<br />
<br />
=== Test Setup / Teardown ===<br />
<br />
What's missing in [[Example Test SQLite Assets]] are individual test Setup and Teardown methods. These methods allow each test to be completely self sufficient without the code duplication needed to set up the test environment at the start of each test.<br />
<br />
Let's assume the <code>SQLiteAssetData</code> class provided a <code>FetchAsset()</code> method and a <code>UpdateAsset()</code> method. Since every test should be independent of any other test, and <code>FetchAsset()</code> and <code>UpdateAsset()</code> should be tested in separate tests, that means each test would need to create its own entries in the asset table in order to succeed. You may have something like this (see [[Example Test SQLite Assets#This Test is Flawed|Example Test SQLite Assets]] for an explanation of <code>sqldb.executeSQL()</code>):<br />
<br />
<source lang="csharp">[Test]<br />
public void T101_TestFetchAsset()<br />
{<br />
AssetBase a1 = new AssetBase(...);<br />
sqldb.executeSQL("INSERT INTO assets VALUES({0}, ...)", a1.uuid, ...);<br />
<br />
AssetBase a1_actual = db.FetchAsset(a1.uuid);<br />
<br />
Assert.Equal(a1_actual.uuid, a1.uuid);<br />
Assert.Equal(a1_actual.Name, a1.Name);<br />
// etc<br />
}<br />
<br />
[Test]<br />
public void T103_TestUpdateAsset()<br />
{<br />
AssetBase a1 = new AssetBase(...);<br />
sqldb.executeSQL("INSERT INTO assets VALUES({0}, ...)", a1.uuid, ...);<br />
<br />
a1.Name = "new name";<br />
<br />
db.UpdateAsset(a1.uuid, a1);<br />
<br />
AssetBase a1_actual = sqldb.executeSQL("SELECT * FROM assets WHERE uuid = {0}", a1.uuid);<br />
<br />
Assert.Equal(a1_actual.uuid, a1.uuid);<br />
Assert.Equal(a1_actual.Name, a1.Name);<br />
// etc<br />
}<br />
</source><br />
<br />
You will note that both tests have the same code at the top in which they create an entry in the assets table. This duplicate code can be factored out into a Setup method, which is called before every test is executed (assume <code>a1</code> is a class attribute):<br />
<br />
<source lang="csharp"><br />
[SetUp]<br />
public void SetUp()<br />
{<br />
a1 = new AssetBase(...);<br />
sqldb.executeSQL("INSERT INTO assets VALUES({0}, ...)", a1.uuid, ...);<br />
}<br />
<br />
[TearDown]<br />
public void TearDown()<br />
{<br />
// clean up after ourselves so the next test has a clean DB to start with<br />
sqldb.executeSQL("DELETE FROM assets");<br />
}<br />
<br />
[Test]<br />
public void T101_TestFetchAsset()<br />
{<br />
AssetBase a1_actual = db.FetchAsset(a1.uuid);<br />
<br />
Assert.Equal(a1_actual.uuid, a1.uuid);<br />
Assert.Equal(a1_actual.Name, a1.Name);<br />
// etc<br />
}<br />
<br />
[Test]<br />
public void T103_TestUpdateAsset()<br />
{<br />
a1.Name = "new name";<br />
<br />
db.UpdateAsset(a1.uuid, a1);<br />
<br />
AssetBase a1_actual = sqldb.executeSQL("SELECT * FROM assets WHERE uuid = {0}", a1.uuid);<br />
<br />
Assert.Equal(a1_actual.uuid, a1.uuid);<br />
Assert.Equal(a1_actual.Name, a1.Name);<br />
// etc<br />
}<br />
</source><br />
<br />
Also note the <code>TearDown()</code> method; it is called after each test has run, regardless whether the test passed or failed. It deletes all the entries in the <code>assets</code> table so that there is no leftover data in the database to interfere with the next test.<br />
<br />
==== Multiple Setup Methods ====<br />
<br />
Not all setup and teardown must happen in methods declared [SetUp] and [TearDown]. It may be useful to provide methods which perform part of the setup and to call them from whichever test may need it:<br />
<br />
<source lang="csharp"><br />
private AssetBase InsertAssetWithRandomData(UUID assetUuid)<br />
{<br />
AssetBase asset = new AssetBase(assetUuid);<br />
asset.Name = somethingRandom();<br />
asset.Data = somethingRandom();<br />
<br />
sqldb.executeSQL("INSERT INTO assets VALUES({0}, ...)", asset.uuid, ...);<br />
<br />
return asset;<br />
}<br />
<br />
[Test]<br />
public void T201_TestNeedsTwoAssets()<br />
{<br />
AssetBase a1 = InsertAssetWithRandomData(uuid1);<br />
AssetBase a2 = InsertAssetWithRandomData(uuid2);<br />
// etc<br />
}<br />
<br />
[Test]<br />
public void T203_TestNeedsFiveAssets()<br />
{<br />
AssetBase a1 = InsertAssetWithRandomData(uuid1);<br />
AssetBase a2 = InsertAssetWithRandomData(uuid2);<br />
AssetBase a3 = InsertAssetWithRandomData(uuid3);<br />
AssetBase a4 = InsertAssetWithRandomData(uuid4);<br />
AssetBase a5 = InsertAssetWithRandomData(uuid5);<br />
// etc<br />
}<br />
</source><br />
<br />
Notice that <code>InsertAssetWithRandomData</code> is <code>private</code> as it's only called from within the class.<br />
<br />
=== Asserts ===<br />
You will see scattered through the code '''Assert.That(...)'''. These will throw an exception if the condition is not valid. This format of assertions is called the [http://www.nunit.org/index.php?p=constraintModel&r=2.4 Constraint Model] in NUnit, and provides a large number of tests with the flavor of:<br />
* Assert.That(foo, Is.Null)<br />
* Assert.That(foo, Is.Not.Null)<br />
* Assert.That(foo, Is.True)<br />
* Assert.That(foo, Is.EqualTo(bar))<br />
* Assert.That(foo, Text.Matches( "*bar*" ))<br />
<br />
Of note, Is.EqualTo uses the Equals function of foo, so this can only be used on objects that are IComparable. Most of the OpenSim base objects are not, so you'll have to compare fields manually in tests.<br />
<br />
For the complete set of conditions you can use see [http://www.nunit.org/index.php?p=constraintModel&r=2.4 the Constraint Model NUnit documentation]. While there is another syntax for tests, the Constraint Model is preferred as it is far more human readable.<br />
<br />
=== Simple Negative Tests ===<br />
<br />
See [[Example Test SQLite Assets]] for this code snipped in context.<br />
<br />
<source lang="csharp">[Test]<br />
public void T001_LoadEmpty()<br />
{<br />
Assert.That(db.ExistsAsset(uuid1), Is.False);<br />
Assert.That(db.ExistsAsset(uuid2), Is.False);<br />
Assert.That(db.ExistsAsset(uuid3), Is.False);<br />
}<br />
</source><br />
<br />
Test T001 is an example of a simple negative test. We assume a new database will not have any of those assets in them. While the value of this test may look low, it does provide a baseline in ensuring that the database connection is there, that these return false correctly, and that no other exception is thrown. Negative tests are a good way to force bounds conditions and ensure that not only does it ''return what you expect'' it also ''doesn't return what you don't expect''. Thought of another way, it ensures your code is somewhat defensive in nature, not coughing on bad or unexpected data.<br />
<br />
=== Simple Positive Tests ===<br />
<br />
See [[Example Test SQLite Assets]] for this code snipped in context.<br />
<br />
<source lang="csharp"><br />
[Test]<br />
public void T010_StoreSimpleAsset()<br />
{<br />
AssetBase a1 = new AssetBase(uuid1, name1);<br />
AssetBase a2 = new AssetBase(uuid2, name2);<br />
AssetBase a3 = new AssetBase(uuid3, name3);<br />
a1.Data = asset1;<br />
a2.Data = asset1;<br />
a3.Data = asset1;<br />
<br />
db.CreateAsset(a1);<br />
db.CreateAsset(a2);<br />
db.CreateAsset(a3);<br />
<br />
AssetBase a1a = db.FetchAsset(uuid1);<br />
Assert.That(a1a.ID, Is.EqualTo(uuid1));<br />
Assert.That(a1a.Name, Is.EqualTo(name1));<br />
<br />
AssetBase a2a = db.FetchAsset(uuid2);<br />
Assert.That(a2a.ID, Is.EqualTo(uuid2));<br />
Assert.That(a2a.Name, Is.EqualTo(name2));<br />
<br />
AssetBase a3a = db.FetchAsset(uuid3);<br />
Assert.That(a3a.ID, Is.EqualTo(uuid3));<br />
Assert.That(a3a.Name, Is.EqualTo(name3));<br />
}<br />
</source><br />
T010 is an example of a simple positive test. In it we create and store 3 assets (ensuring no exceptions), then load those 3 assets back from the database and ensure the fields are correct. Because AssetBase is not IComparible we just check the ID and Name fields with equals tests. If any of the Asserts fail, the whole test fails.<br />
<br />
=== Stateful Tests ===<br />
<br />
See [[Example Test SQLite Assets]] for this code snipped in context.<br />
<br />
<source lang="csharp"><br />
[Test]<br />
public void T011_ExistsSimpleAsset()<br />
{<br />
Assert.That(db.ExistsAsset(uuid1), Is.True);<br />
Assert.That(db.ExistsAsset(uuid2), Is.True);<br />
Assert.That(db.ExistsAsset(uuid3), Is.True);<br />
}<br />
</source><br />
<br />
T011 is an example of a stateful test, because it requires the state created by T010 (i.e. the creation of those 3 objects). In order to test any kind of complicated scenario you will find that you need to use stateful tests to build up various amounts of state (testing along the way), then manipulating and possibly tearing it down. Without doing this you can't do truly deep testing of function in any complex environment. This example isn't very stateful (I tried to pick an easy example), but it should give you some ideas.<br />
<br />
=== Speculative Tests ===<br />
Speculative tests are tests that might or might not apply in a given situation. MySQL testing in the OpenSim tree is done by speculative testing, the tests will only run if there is a properly configured database, otherwise they will not be run. If you execute '''Assert.Ignore()''' in a '''Test''' the test will end and be ignored. If you run '''Assert.Ignore()''' in the '''TestFixtureSetup''' all tests in the test fixture will be skipped and ignored.<br />
<br />
Speculative testing lets you create tests that require certain preconditions to be met which you can't guarantee on all platforms/configuration, and are an important part of deep testing.<br />
<br />
== Adding Tests to the Tree ==<br />
As we said previously all tests for assembly OpenSim.Foo (in directory OpenSim/Foo) should:<br />
* be in assembly OpenSim.Foo.Tests.dll<br />
* not be in the OpenSim.Foo.dll assembly<br />
* be in OpenSim/Foo/Tests directory<br />
<br />
Also, if you have created a new test assembly you must add references<br />
to it in ''.nant/local.include'', both to the <br />
* ''test'' target, and the<br />
* ''test-xml'' target<br />
to ensure that the assembly is added to the automated panda runs as<br />
well as the nant ''test'' target.<br />
<br />
== Executing Tests ==<br />
<br />
=== Bamboo ===<br />
On every commit to opensim all the tests are run on a [http://opensimulator.org:8085 Bamboo build server on opensimulator.org]. The process takes about 5 minutes to build, test, and report the results back out on #opensim-dev via the osmantis bot.<br />
<br />
=== Nant ===<br />
You can manually run all the tests for OpenSim on your system by running '''nant test''' as a nant target. This will run all the tests that are in the tree, though some speculative tests might be ignored if your platform does not have the right features or configuration to run these tests.<br />
<br />
=== NUnit Console ===<br />
If you only want to run tests for one assembly you can do that using the NUnit Console. On Linux just run '''nunit-console2 OpenSim.Foo.Tests.dll''' and it will run only the tests for OpenSim.Foo.Tests.dll. If you are only making changes to 1 dll and just want a quick sanity check, this is the fastest way to do that.<br />
<br />
=== Debugging Tests ===<br />
There is a special page dedicated to this. See [[Debugging Unit Tests]].<br />
<br />
== Learning More ==<br />
You should definitely read the documentation at the [http://www.nunit.org/index.php?p=documentation NUnit homepage] if you want to know more about testing. It's a very good reference for all the APIs in NUnit that you can use for creating tests.<br />
<br />
== Code Coverage ==<br />
<br />
A prototype has been included using monocov, which has a profile built-in in mono. Instructions for using monocov can be found on the Mono homepage, in [http://www.mono-project.com/Code_Coverage Code Coverage] section. Unfortunately nunit2 and nant do not support code coverage with monocov (only some other proprietary code coverages), so there is no <monocov> tag. The solution was to implement it using many nunit-console and on <exec> tags. <br />
<br />
ATTENTION: Code coverage only works with mono 1.2.x , any other version will most likely not work. Code coverage development is being put on hold for now until it supports newer mono versions.<br />
<br />
=== Running ===<br />
<br />
Download [http://primates.ximian.com/~lupus/monocov-0.2.tar.gz monocov] and [http://prdownloads.sourceforge.net/nunit/NUnit-2.4.8-net-2.0.zip?download nunit-console] if your nunit-console does not work. To test if it works (my Ubuntu's Hardy version did not), just run one of the tests with nunit-console.<br />
<br />
Install monocov (./configure, ./make install, there could be some minor conflicts, I had to add to the compiling line -I/usr/include/mono-1.0/) and make sure the working nunit-console.exe is in /usr/lib/nunit/nunit-console.exe. Now just run nant test-cov and it will generate .cov files and HTML directories in the cov directory. The .cov files can be seen by running monocov on them, and have the same information as the HTML directories.<br />
<br />
== Testing Todo ==<br />
<br />
=== Coverage ===<br />
<br />
A prototype has been done and documented. Now we must keep a look if monocov will evolve to support newer mono versions.<br />
<br />
[[Category:Development]]<br />
[[Category:Testing]]<br />
<br />
== Links to More Information on Unit Testing ==<br />
<br />
* [http://www.nunit.org/index.php?p=quickStart&r=2.4 NUnit Quick Start]<br />
* [http://xunitpatterns.com/ xUnit Patterns book homepage], with lots of information on good practices, patterns, code smells, etc.<br />
* There is a lot of information on unit testing at the [http://c2.com/cgi/wiki?search=unittest Cunningham & Cunningham, Inc wiki at c2.com]</div>DrScofieldhttp://opensimulator.org/wiki/Server_StatsServer Stats2009-06-26T11:58:03Z<p>DrScofield: fixing typo</p>
<hr />
<div>__NOTOC__<br />
{{Template:Quicklinks}}<br />
<br /><br />
<br />
[[Image:statsmem.png|400px|thumb|right|Region Service memory consumption]]<br />
[[Image:statsthreads.png|400px|thumb|right|Monitoring of OpenSim threads...]]<br />
[[Image:statscpu.png|400px|thumb|right|Check out the CPU-load]]<br />
<br />
==Installation steps==<br />
<br />
* Get Serverstats from [http://download.berlios.de/serverstats/serverstats-0.8.2.tar.bz2 Berlios]<br />
* Install rrdtool (depending on your distro, it should be in the repository. Otherwise download [http://oss.oetiker.ch/rrdtool/ here])<br />
* Copy serverstats to /my/apache/root/serverstats<br />
* Move ./serverstats/config.sample/ to ./serverstats/config/<br />
* Get the OpenSim serverstats module, and place in the config directory:<br />
<source lang="bash"><br />
cd ./serverstats/config<br />
svn checkout http://forge.opensimulator.org/svn/serverstats/trunk .<br />
</source><br />
<br />
* Edit ./serverstats/config/sources.php, and add this code:<br />
<source lang="php"><br />
include "opensim.php";<br />
$config['opensim']['module'] = new opensim();<br />
</source><br />
* Edit ./serverstats/config/graph.php, and add this code:<br />
<source lang="php"><br />
$config['list'][] = array(<br />
'title' => 'OpenSim CPU',<br />
'lowerLimit' => 0,<br />
'altAutoscaleMax' => true,<br />
'content' => array(<br />
array(<br />
'type' => 'AREA',<br />
'source' => 'opensim',<br />
'ds' => 'opensim_cpu_sys',<br />
'cf' => 'AVERAGE',<br />
'legend' => 'OpenSim Sys CPU%',<br />
'color' => 'FF0000',<br />
),<br />
array(<br />
'type' => 'AREA',<br />
'source' => 'opensim',<br />
'ds' => 'opensim_cpu_user',<br />
'cf' => 'AVERAGE',<br />
'legend' => 'OpenSim User CPU%',<br />
'color' => '00FF00',<br />
'stacked' => true,<br />
),<br />
)<br />
);<br />
<br />
$config['list'][] = array(<br />
'title' => 'OpenSim Threads',<br />
'lowerLimit' => 0,<br />
'altAutoscaleMax' => true,<br />
'content' => array(<br />
array(<br />
'type' => 'AREA',<br />
'source' => 'opensim',<br />
'ds' => 'opensim_threads',<br />
'cf' => 'AVERAGE',<br />
'legend' => 'number of opensim threads',<br />
'color' => '0000BB',<br />
),<br />
)<br />
);<br />
<br />
$config['list'][] = array(<br />
'title' => 'OpenSim Memory',<br />
'lowerLimit' => 0,<br />
'altAutoscaleMax' => true,<br />
'content' => array(<br />
array(<br />
'type' => 'AREA',<br />
'source' => 'opensim',<br />
'ds' => 'opensim_virt',<br />
'cf' => 'AVERAGE',<br />
'legend' => 'OpenSim Memory (Virt)',<br />
'color' => '00BB00'<br />
),<br />
array(<br />
'type' => 'AREA',<br />
'source' => 'opensim',<br />
'ds' => 'opensim_real',<br />
'cf' => 'AVERAGE',<br />
'legend' => 'OpenSim Memory (Real)',<br />
'color' => 'BB0000'<br />
),<br />
)<br />
);<br />
</source><br />
now find the following bit of code at the bottom:<br />
<source lang="php"><br />
// Define what Graphes we want in the detail view (detail.php)<br />
$config['types'] = array(<br />
// array('title' => 'Hour', 'period' => 3600), // only useful if you have a small step<br />
array('title' => 'Day', 'period' => 86400),<br />
array('title' => 'Week', 'period' => 604800),<br />
array('title' => 'Month', 'period' => 2678400),<br />
array('title' => 'Year', 'period' => 31536000)<br />
);<br />
// The period uses in the graph overview (index.php)<br />
$config['defaultperiod'] = 86400;<br />
</source><br />
and change it to:<br />
<source lang="php"><br />
// Define what Graphes we want in the detail view (detail.php)<br />
$config['types'] = array(<br />
array('title' => 'Hour', 'period' => 10800), // only useful if you have a small step<br />
array('title' => 'Day', 'period' => 86400),<br />
array('title' => 'Week', 'period' => 604800),<br />
array('title' => 'Month', 'period' => 2678400),<br />
array('title' => 'Year', 'period' => 31536000)<br />
);<br />
// The period uses in the graph overview (index.php)<br />
$config['defaultperiod'] = 10800;<br />
</source><br />
<br />
* Edit ./serverstats/config/main.php, and change this code:<br />
from:<br />
<source lang="php"><br />
'step' => 300<br />
</source><br />
to:<br />
<source lang="php"><br />
'step' => 60<br />
</source><br />
<br />
* Make sure you allow php to access /proc . Edit php.ini and set open_basedir = ..:/proc<br />
* Add a crontab with 'crontab -e', and enter a cronjob for update.php:<br />
<source lang="php"><br />
* * * * * php /my/apache/root/serverstats/update.php<br />
</source><br />
* Check out if the script executes the way it's supposed to be, by running it from the shell. <br />
<source lang="bash"><br />
php update.php<br />
</source><br />
<br />
Done! Now check out if the graphs are generated, by pointing your browser to the serverstats directory. You'll see some nice stats if everything went right.</div>DrScofieldhttp://opensimulator.org/wiki/ConciergeModuleConciergeModule2009-01-31T17:30:24Z<p>DrScofield: /* ConciergeModule */</p>
<hr />
<div>The ConciergeModule is an optional region module that tries to provide "concierge services" for online meetings and events.<br />
<br />
== Current functionality ==<br />
<br />
it currently <br />
<br />
* keeps an attendee list of avatars in a concierged region<br />
* announces to every avatar in a concierged region when a new avatar enters the region or someone leaves the region<br />
* can post the attendee list to an outside broker whenever the attendee list changes<br />
* can send a welcome message to each avatar entering the region<br />
<br />
The ConciergeModule can in addition replace OpenSim's normal Chat module and "amplify" speech in a concierged region so that it is "audible" region-wide (whispering will still be range limited).<br />
<br />
== Planned functionality ==<br />
<br />
We have several ideas on extending ConciergeModule further:<br />
<br />
* allow each participant to have meeting notes send by email<br />
* post meeting notes to the broker<br />
* allow "/jeeves please..." style commands (instead of using private channels)<br />
* have an OAR file POSTed capturing the current state of the meeting space<br />
* grant and revoke group membership and permissions (once group and permission system is more evolved)<br />
<br />
== Configuration ==<br />
<br />
''TBD''</div>DrScofieldhttp://opensimulator.org/wiki/ConciergeModuleConciergeModule2009-01-31T17:26:45Z<p>DrScofield: adding concierge module description</p>
<hr />
<div>= ConciergeModule =<br />
<br />
The ConciergeModule is an optional region module that tries to provide "concierge services" for online meetings and events.<br />
<br />
== Current functionality ==<br />
<br />
it currently <br />
<br />
* keeps an attendee list of avatars in a concierged region<br />
* announces to every avatar in a concierged region when a new avatar enters the region or someone leaves the region<br />
* can post the attendee list to an outside broker whenever the attendee list changes<br />
* can send a welcome message to each avatar entering the region<br />
<br />
The ConciergeModule can in addition replace OpenSim's normal Chat module and "amplify" speech in a concierged region so that it is "audible" region-wide (whispering will still be range limited).<br />
<br />
== Planned functionality ==<br />
<br />
We have several ideas on extending ConciergeModule further:<br />
<br />
* allow each participant to have meeting notes send by email<br />
* post meeting notes to the broker<br />
* allow "/jeeves please..." style commands (instead of using private channels)<br />
* have an OAR file POSTed capturing the current state of the meeting space<br />
* grant and revoke group membership and permissions (once group and permission system is more evolved)<br />
<br />
== Configuration ==<br />
<br />
''TBD''</div>DrScofieldhttp://opensimulator.org/wiki/Second_BirthdaySecond Birthday2009-01-29T15:06:01Z<p>DrScofield: /* Blog Entries */</p>
<hr />
<div>[[Image:OpenSim_2nd_Birthday_Banner.png]]<br />
<br />
== History ==<br />
The consensus is that OpenSim was 'born' on Jan 29 2007, when Darren Guard (MW) made his prototypical c# 3D world server publicly available. Help us celebrate this joyous occasion! Read [[History]] for some recap of the early days.<br />
<br />
== Activities ==<br />
Here you can add your activity, sorted by starting time GMT. Please supply at least basic information (when it starts, ends, what happens and how to get there). Also, if the activity takes place in a public hypergrid location, feel free to add link-region information so that others can link to your region.<br />
<br />
Consider announcing your party on the opensim-users mailing list.<br />
<br />
=== Jan 28 2009 ===<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
!When? (GMT)<br />
!When? (Local Time)<br />
!Duration<br />
!What?<br />
!Where?<br />
!How do I get there?<br />
![[Hypergrid|link-region server and port]]<br />
|-<br />
|9:00pm<br />
|1:00pm (PST)<br />
|90 minutes<br />
|Foolish Frost live from the Cornfield<br />
|Rezzable Private Grid Alpha<br />
|[http://rezzable.com/blog/vint-falken/opensim-2nd-birthday-celebration-foolish-frost-live-cornfield Instructions for existing & new accounts.]<br />
|Non-hypergrid. (for now)<br />
|}<br />
<br />
=== Jan 29 2009 ===<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
!When? (GMT)<br />
!When? (Local Time)<br />
!Duration<br />
!What?<br />
!Where?<br />
!How do I get there?<br />
![[Hypergrid|link-region server and port]]<br />
|-<br />
|9:00pm (GMT)<br />
|10:00pm (Local Time)<br />
|3 hours<br />
|Presentation of Cyberlandia (Italian) grid, ((((Welcome areas, outstanding building architecture tour and Dancing Party for everybody)))) <br />
|www.cyberlandia.net www.opensimita.org<br />
| "Born To Learn" and "Cyberlandia" sims. At entry point will find agenda and landmark givers. NB: due to severe instability problems we experienced in latest days we are not sure the event can take place without problems... The enthusiasm of the builders did provoke crashes on the land. If this is going to happen again this evening, please consider to use also the IRC channel on freenet (#cyberlandia) or going to web client http://www.cyberlandia.net/index.php?&page=smodul&id=17&btn=17 . When we will find the origin of the inconsistencies and solve the problems (probably posting some mantis), we will reschedule the presentation again. People interested in the Italian Cyberlandia project can also try to join the http://tinyurl.com/opensimita skype channel where people is connected during European day and evening/night.<br />
|[[Hypergrid|grid.cyberlandia.net:8002]]<br />
|-<br />
|20:00pm (GMT)<br />
|21:00pm (Local Time)<br />
|2+ hours<br />
|Game over for SL - Dark musix party, lottery and more. switch to night before enterering.<br />
|www.schwarze-welle.de www.osgrid.org<br />
| SCHWARZE WELT and surounding regions in osgrid<br />
|[[Hypergrid|87.230.89.74:9000]]<br />
|-<br />
|14:00pm (GMT)<br />
|6:00am (PST)<br />
|1 hour<br />
|Introduction to Building - learn to build in OpenSim<br />
|http://reactiongrid.com<br />
| ReactionGrid Welcome Sim will have all markers and directions to which sims for each of the events.<br />
|[[Hypergrid|http://gsquared.info:8008]]<br />
|-<br />
|21:00pm (GMT)<br />
|13:00pm (PST)<br />
|1 hour<br />
|Introduction to Building - repeated for west coast and those who could not make it to the earlier class<br />
|http://reactiongrid.com<br />
| ReactionGrid Welcome Sim will have all markers and directions to which sims for each of the events.<br />
|[[Hypergrid|http://gsquared.info:8008]]<br />
|}<br />
<br />
=== Jan 30 2009 ===<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
!When? (GMT)<br />
!When? (Local Time)<br />
!Duration<br />
!What?<br />
!Where?<br />
!How do I get there?<br />
![[Hypergrid|link-region server and port]]<br />
|-<br />
|21:00pm (GMT)<br />
|13:00pm (PST)<br />
|1 hour<br />
|Particle Madness - learn to make your own particle effects<br />
|http://reactiongrid.com<br />
| ReactionGrid Welcome Sim will have all markers and directions to which sims for each of the events.<br />
|[[Hypergrid|http://gsquared.info:8008]]<br />
|-<br />
|22:00pm (GMT)<br />
|14:00pm (PST)<br />
|1 hour<br />
|1939 World's Fair weekly meeting, 22:00-23:00 UTC - anyone interested in learning more and possibly participating in the reconstruction project are more than welcome to come along! <br />
|http://reactiongrid.com<br />
| 39FairHQ sim <br />
|[[Hypergrid|http://gsquared.info:8008]]<br />
|}<br />
<br />
=== Jan 31 2009 ===<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
!When? (GMT)<br />
!When? (Local Time)<br />
!Duration<br />
!What?<br />
!Where?<br />
!How do I get there?<br />
![[Hypergrid|link-region server and port]]<br />
|-<br />
|16:00pm (GMT)<br />
|8:00am (PST)<br />
|1 hour<br />
|Creating Prim Hair - learn to make your prim hair<br />
|http://reactiongrid.com<br />
| ReactionGrid Welcome Sim will have all markers and directions to which sims for each of the events.<br />
|[[Hypergrid|http://gsquared.info:8008]]<br />
|-<br />
|22:00pm (GMT)<br />
|14:00pm (PST)<br />
|til late night<br />
|Mega Fright Night - public domain movies streamed to Reactiongrid - sit in an old time car (drive in style) or pop a squat on a tomato and pitch tomatoes at the screen and scream. A real fun time and we are planning to keep this running all night long - among movies you will see Gila Monster, House on Haunted Hill, and many more<br />
|http://reactiongrid.com<br />
| Tarzan sim - directions and more at Welcome sim entrance or just head to Tarzan sim and join in!<br />
|[[Hypergrid|http://gsquared.info:8008]]<br />
|}<br />
<br />
=== Jan 31 - Feb 1 2009 ===<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
!When? (GMT)<br />
!When? (Local Time)<br />
!Duration<br />
!What?<br />
!Where?<br />
!How do I get there?<br />
![[Hypergrid|link-region server and port]]<br />
|-<br />
|24:<br />
|24: <br />
|48 hours<br />
|Sailing Regatta - Live Music DJ's - Hypergrid - freebies<br />
|[[OSGrid]]<br />
|http://simzee.com/event.html<br />
|OSGrid, M1 Rock (42, 96, 25) <br />
|}<br />
<br />
=== Feb 3 2009 ===<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
!When? (GMT)<br />
!When? (Local Time)<br />
!Duration<br />
!What?<br />
!Where?<br />
!How do I get there?<br />
![[Hypergrid|link-region server and port]]<br />
|-<br />
|20:00pm (GMT)<br />
|12:00pm (PST)<br />
|1 hour<br />
|Photoshop CS3 for Textures<br />
|http://reactiongrid.com<br />
| ReactionGrid Welcome Sim will have all markers and directions to which sims for each of the events.<br />
|[[Hypergrid|http://gsquared.info:8008]]<br />
|-<br />
|21:00pm (GMT)<br />
|13:00pm (PST)<br />
|1 hour<br />
|Avatar Clothing Tutorial<br />
|http://reactiongrid.com<br />
| ReactionGrid Welcome Sim will have all markers and directions to which sims for each of the events.<br />
|[[Hypergrid|http://gsquared.info:8008]]<br />
|}<br />
<br />
== Demos and Exhibits ==<br />
Here you can add your ongoing demo and/or interesting content. Please supply a brief description of the demo and/or content. Also, if the activity takes place in a public hypergrid location, feel free to add link-region information so that others can link to your region.<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
!Title<br />
!Description<br />
!Location<br />
![[Hypergrid|link-region server and port]]<br />
<br />
|-<br />
|Urban Planning modules<br />
|Traffic and pedestrian simulations in the UCI Grid, provided by [http://encitra.com/ Encitra].<br />
|UCI Grid. Go to Gateway 7000 and use the teleporter for UCI Campus (1,1). Or link to it directly, using the info on the right.<br />
|ucigrid01.nacs.uci.edu:9000 (centered in the 8000's)<br />
<br />
|-<br />
|Metaverse Illuminations Gallery<br />
|Large gallery of high-quality Second Life documentary photography<br />
|OSGrid: Snoopies/21/15/521 (skybox) manual link: secondlife://Snoopies/21/15/521 <br />
|(not sure!)<br />
<br />
<br />
|-<br />
|German welcome area<br />
|Informationen fuer deutsche Newbies im Osgrid, Freebies in Sharkland Hills, Mitbauer willkommen, Mietregionen<br />
|OSGrid, Sharkland Tropical 3<br />
|regionsDE.ralf-haifisch.biz:9000<br />
<br />
|-<br />
|OpenSim Dutchies<br />
|Mostly empty, but if you're lucky you catch me there for some information about interconnectivity between webinterface and virtual world, using wixtd and OpenSim<br />
|OSN Grid<br />
|os-networks:9000<br />
<br />
|-<br />
|Pseudospace - Ellis Island Welcome Center & Telehub<br />
|Pop on by and enjoy a slice of open sourced birthday cake and punch in our lobby! Feel free to look around and explore some of the different roleplay environments we're working on and help yourself to some freebies from our content library. All sims on the grid are HyperGrid enabled so no need to worry about becoming stranded if you teleport off of Ellis Island. :)<br />
|Pseudospace<br />
|ellis.pseudospace.net:9000 <br />
centered at 9000,9000<br />
<br />
|-<br />
|OpenSimulator-Club<br />
|Club (german language) for upcoming OpenSimulator and 3D-Internet activities. Founded to support the OpenSimulator 2nd birthday event.<br />
|&nbsp;<br />
|http://www.talentraspel.de/index.php?option=com_content&view=article&id=53&Itemid=72<br />
<br />
|-<br />
|3D-Internet TV<br />
|Web-TV channel (german language) covering news and developments for 3D-Internet activities. The OpenSimulator 2nd birthday event will be reported too.<br />
|&nbsp;<br />
|http://www.talentraspel.de/index.php?option=com_wrapper&view=wrapper&Itemid=105<br />
<br />
|-<br />
|Schwarze Welle<br />
|Club and Shops (german/english) , 3D representation of www.schwarze-welle.de dark music radio. every monday german osgrid meeting 20:00 at next region SCHWARZE WELT<br />
|OSGrid, SCHWARZE WELT<br />
|87.230.89.74:9000<br />
<br />
|-<br />
|Open Vue<br />
|Virtual University of Edinburgh on Opensim hosted on the Virtual AIAI Grid<br />
|&nbsp;<br />
|http://vue.ed.ac.uk/openvue/<br />
<br />
|-<br />
|Folk Cate Delta<br />
|Edy Rau's Folk Cafe(german/english) , every thursday 1 to 2 hours live musicans. 20 MET (11 PST)<br />
|Grid4Us, Folk Cafe Delta<br />
|http://grid4us.net:9020 (centered to 8500, 8500)<br />
|}<br />
<br />
== Blog Entries ==<br />
Keep a list of the 2nd Birthday Blog Entries here:<br />
* [http://opensimulator.info/article.php/Opensim-Les-anniversaires Happy 2nd birthday Opensimulator]<br />
* [http://www.cybertechnews.org/?p=529 CyberTech News blog post]<br />
* [http://xyzzyxyzzy.net/2009/01/29/happy-2nd-birthday-opensim/ happy 2nd birthday opensim (xyzzyxyzzy.net)]<br />
<br />
== Resources ==<br />
<br />
=== Hypergrid Bridges ===<br />
<br />
To bridge between grids in the 1000's and grids in the 10,000's, you can use 2 gateways in the UCI Grid:<br />
<br />
* Gateway 3000, placed in position 3,000 3,000: ucigrid04.nacs.uci.edu 9003<br />
* Gateway 7000, placed in position 7,000 7,000: ucigrid04.nacs.uci.edu 9007<br />
<br />
=== Banners ===<br />
This banner is suitable for inclusion on your own web page, in blogs et c:<br />
<br />
[[Image:OpenSim_2nd_Birthday_Banner.png]]<br />
<br />
(Courtesy [http://www.vintfalken.com Vint Falken])<br />
<br />
=== Invitation Card ===<br />
This image is suitable for creating your own invitation notecards:<br />
<br />
[[Image:OpenSim_Second_Birthday_Note.png]]<br />
<br />
(Courtesy [http://www.vintfalken.com Vint Falken])</div>DrScofieldhttp://opensimulator.org/wiki/New_Region_ModulesNew Region Modules2009-01-26T09:53:18Z<p>DrScofield: /* Questions */</p>
<hr />
<div>(This is a first draft-version and can change at any time until complete<br />
implementation. Feel free to comment, either on the Discussion page or on the<br />
opensim-dev mailing list)<br />
<br />
= Why =<br />
<br />
The current RegionModule system's API is in part inconsistent and doesn't<br />
really support region-restarts and adding/removing regions on the fly during<br />
a region-server run.<br />
E.g., the API says ''Initialise'' is called for every region (in every<br />
region-module), after that, ''PostInitialise'' is called for every region-module.<br />
When a new region is added, what should happen?<br />
* Don't call ''Initialise'': Then the region-module isn't initialised for that region, which leads to missing functionality.<br />
* Call ''Initialise'': Then ''PostInitialise'' was called too early. Actually, ''PostInitialise'' can not be called at all, because you can add a region after that anytime.<br />
<br />
What should happen if a region is restarted? What should happen if a region<br />
is removed?<br />
<br />
<br />
= What =<br />
<br />
The new region-module system is based on three interfaces: ''ISharedRegionModule'',<br />
''INonSharedRegionModule'' and ''IRegionModuleBase'', which is the base interface for<br />
the other two.<br />
<br />
public interface IRegionModuleBase<br />
{<br />
string Name { get; }<br />
void Initialise(IConfigSource source);<br />
void Close();<br />
void AddRegion(Scene scene);<br />
void RemoveRegion(Scene scene);<br />
}<br />
<br />
public interface ISharedRegionModule : IRegionModuleBase<br />
{<br />
void PostInitialise();<br />
}<br />
<br />
public interface INonSharedRegionModule : IRegionModuleBase<br />
{<br />
}<br />
<br />
* Loading the region-modules' classes happens via ''Mono.Addins'' on server-start. <br />
* Instantiating the region-modules happens...<br />
** for ''ISharedRegionModule''s once after loading (on server start)<br />
** for ''INonSharedRegionModule''s after creation of the ''Scene'' object.<br />
* You can cleanup when a region is removed.<br />
* You can cleanup before the server shuts down.<br />
<br />
;Note:<br />
:A ''PostInitialise'' for a ''INonSharedRegionModule'' doesn't make a lot of sense, as we don't have a certain point from which on we won't call ''Initialise'' on a ''INonSharedRegionModule'' again. Every time a new region is added (on restart, too), a new instance is created and ''Initialise'' is called on that instance, so the intended semantics of ''PostInitialise'' will never apply.<br />
<br />
= Details =<br />
<br />
== Start of region-server ==<br />
<br />
* Region-server starts, the classes of all region-modules are loaded in no particular order<br />
* The ''Scene''s are instantiated.<br />
** For every ''ISharedRegionModule'', one instance is created and ''Initialise'' is called.<br />
** For every ''ISharedRegionModule'' instance, ''PostInitialise'' is called.<br />
** For every ''Scene'', for every ''INonSharedRegionModule'', a new instance is created and ''Initialise'' called.<br />
** For every ''Scene'', for every ''INonSharedRegionModule'' and ''ISharedRegionModule'', ''AddRegion(scene)'' is called. The modules are associated to the ''Scene'' (for deletion on remove)<br />
<br />
<br />
== Adding a region ==<br />
<br />
* For every ''INonSharedRegionModule'', a new ''INonSharedRegionModule'' instance is created and ''Initialise'' is called<br />
* The new ''Scene'' object is created.<br />
* For every ''INonSharedRegionModule'' and ''ISharedRegionModule'', ''AddRegion(scene)'' is called. The modules are associated to the ''Scene'' (for deletion on remove)<br />
<br />
== Removing a region ==<br />
<br />
* For every ''INonSharedRegionModule'' of the scene and every ''ISharedRegionModule'', ''RemoveRegion(scene)'' is called<br />
* For every ''INonSharedRegionModule'' of the scene, ''Close'' is called<br />
* Every module reference of the scene is removed from the scene. No references should be left after that; the ''INonSharedRegionModule''s could be garbage collected now.<br />
<br />
<br />
== Restarting a region ==<br />
<br />
For simplicity, I'd like to do this as a [[#Removing_a_region|"Removing a region"]], followed by a<br />
[[#Adding_a_region|"Adding a region"]]. Is there a functional reason for not doing that?<br />
<br />
: what happens to avatars that are in a region that you want to restart then? are they kicked out first? should they stay? --- [[User:DrScofield|DrScofield]] 09:51, 26 January 2009 (UTC)<br />
<br />
== Shutdown of the region-server ==<br />
<br />
* For every scene, perform the [[#Removing_a_region|"Removing a region"]] step:<br />
** ''RemoveRegion'' is called for all scenes and modules<br />
** ''Close'' is called for all the ''INonSharedRegionModule''s<br />
* ''Close'' is called for all the ''ISharedRegionModule''. Possible book-keeping references are removed; the ''ISharedRegionModule'' could now be garbage-collected.<br />
<br />
<br />
= Questions =<br />
* Loading via Mono.Addins? Via ExtensionLoader? Via our own loader (like the current one)?<br />
* Configuration about which modules should be loaded?<br />
: we already have the <tt>enabled = true/false</tt> OpenSim.ini config option for most region modules --- [[User:DrScofield|DrScofield]] 09:53, 26 January 2009 (UTC)</div>DrScofieldhttp://opensimulator.org/wiki/New_Region_ModulesNew Region Modules2009-01-26T09:53:01Z<p>DrScofield: enabled = true/false config option</p>
<hr />
<div>(This is a first draft-version and can change at any time until complete<br />
implementation. Feel free to comment, either on the Discussion page or on the<br />
opensim-dev mailing list)<br />
<br />
= Why =<br />
<br />
The current RegionModule system's API is in part inconsistent and doesn't<br />
really support region-restarts and adding/removing regions on the fly during<br />
a region-server run.<br />
E.g., the API says ''Initialise'' is called for every region (in every<br />
region-module), after that, ''PostInitialise'' is called for every region-module.<br />
When a new region is added, what should happen?<br />
* Don't call ''Initialise'': Then the region-module isn't initialised for that region, which leads to missing functionality.<br />
* Call ''Initialise'': Then ''PostInitialise'' was called too early. Actually, ''PostInitialise'' can not be called at all, because you can add a region after that anytime.<br />
<br />
What should happen if a region is restarted? What should happen if a region<br />
is removed?<br />
<br />
<br />
= What =<br />
<br />
The new region-module system is based on three interfaces: ''ISharedRegionModule'',<br />
''INonSharedRegionModule'' and ''IRegionModuleBase'', which is the base interface for<br />
the other two.<br />
<br />
public interface IRegionModuleBase<br />
{<br />
string Name { get; }<br />
void Initialise(IConfigSource source);<br />
void Close();<br />
void AddRegion(Scene scene);<br />
void RemoveRegion(Scene scene);<br />
}<br />
<br />
public interface ISharedRegionModule : IRegionModuleBase<br />
{<br />
void PostInitialise();<br />
}<br />
<br />
public interface INonSharedRegionModule : IRegionModuleBase<br />
{<br />
}<br />
<br />
* Loading the region-modules' classes happens via ''Mono.Addins'' on server-start. <br />
* Instantiating the region-modules happens...<br />
** for ''ISharedRegionModule''s once after loading (on server start)<br />
** for ''INonSharedRegionModule''s after creation of the ''Scene'' object.<br />
* You can cleanup when a region is removed.<br />
* You can cleanup before the server shuts down.<br />
<br />
;Note:<br />
:A ''PostInitialise'' for a ''INonSharedRegionModule'' doesn't make a lot of sense, as we don't have a certain point from which on we won't call ''Initialise'' on a ''INonSharedRegionModule'' again. Every time a new region is added (on restart, too), a new instance is created and ''Initialise'' is called on that instance, so the intended semantics of ''PostInitialise'' will never apply.<br />
<br />
= Details =<br />
<br />
== Start of region-server ==<br />
<br />
* Region-server starts, the classes of all region-modules are loaded in no particular order<br />
* The ''Scene''s are instantiated.<br />
** For every ''ISharedRegionModule'', one instance is created and ''Initialise'' is called.<br />
** For every ''ISharedRegionModule'' instance, ''PostInitialise'' is called.<br />
** For every ''Scene'', for every ''INonSharedRegionModule'', a new instance is created and ''Initialise'' called.<br />
** For every ''Scene'', for every ''INonSharedRegionModule'' and ''ISharedRegionModule'', ''AddRegion(scene)'' is called. The modules are associated to the ''Scene'' (for deletion on remove)<br />
<br />
<br />
== Adding a region ==<br />
<br />
* For every ''INonSharedRegionModule'', a new ''INonSharedRegionModule'' instance is created and ''Initialise'' is called<br />
* The new ''Scene'' object is created.<br />
* For every ''INonSharedRegionModule'' and ''ISharedRegionModule'', ''AddRegion(scene)'' is called. The modules are associated to the ''Scene'' (for deletion on remove)<br />
<br />
== Removing a region ==<br />
<br />
* For every ''INonSharedRegionModule'' of the scene and every ''ISharedRegionModule'', ''RemoveRegion(scene)'' is called<br />
* For every ''INonSharedRegionModule'' of the scene, ''Close'' is called<br />
* Every module reference of the scene is removed from the scene. No references should be left after that; the ''INonSharedRegionModule''s could be garbage collected now.<br />
<br />
<br />
== Restarting a region ==<br />
<br />
For simplicity, I'd like to do this as a [[#Removing_a_region|"Removing a region"]], followed by a<br />
[[#Adding_a_region|"Adding a region"]]. Is there a functional reason for not doing that?<br />
<br />
: what happens to avatars that are in a region that you want to restart then? are they kicked out first? should they stay? --- [[User:DrScofield|DrScofield]] 09:51, 26 January 2009 (UTC)<br />
<br />
== Shutdown of the region-server ==<br />
<br />
* For every scene, perform the [[#Removing_a_region|"Removing a region"]] step:<br />
** ''RemoveRegion'' is called for all scenes and modules<br />
** ''Close'' is called for all the ''INonSharedRegionModule''s<br />
* ''Close'' is called for all the ''ISharedRegionModule''. Possible book-keeping references are removed; the ''ISharedRegionModule'' could now be garbage-collected.<br />
<br />
<br />
= Questions =<br />
* Loading via Mono.Addins? Via ExtensionLoader? Via our own loader (like the current one)?<br />
* Configuration about which modules should be loaded?<br />
: we already have the <tt>enabled = true/false</tt> OpenSim.ini config option for most region modules</div>DrScofieldhttp://opensimulator.org/wiki/New_Region_ModulesNew Region Modules2009-01-26T09:51:22Z<p>DrScofield: question re logged in avatars</p>
<hr />
<div>(This is a first draft-version and can change at any time until complete<br />
implementation. Feel free to comment, either on the Discussion page or on the<br />
opensim-dev mailing list)<br />
<br />
= Why =<br />
<br />
The current RegionModule system's API is in part inconsistent and doesn't<br />
really support region-restarts and adding/removing regions on the fly during<br />
a region-server run.<br />
E.g., the API says ''Initialise'' is called for every region (in every<br />
region-module), after that, ''PostInitialise'' is called for every region-module.<br />
When a new region is added, what should happen?<br />
* Don't call ''Initialise'': Then the region-module isn't initialised for that region, which leads to missing functionality.<br />
* Call ''Initialise'': Then ''PostInitialise'' was called too early. Actually, ''PostInitialise'' can not be called at all, because you can add a region after that anytime.<br />
<br />
What should happen if a region is restarted? What should happen if a region<br />
is removed?<br />
<br />
<br />
= What =<br />
<br />
The new region-module system is based on three interfaces: ''ISharedRegionModule'',<br />
''INonSharedRegionModule'' and ''IRegionModuleBase'', which is the base interface for<br />
the other two.<br />
<br />
public interface IRegionModuleBase<br />
{<br />
string Name { get; }<br />
void Initialise(IConfigSource source);<br />
void Close();<br />
void AddRegion(Scene scene);<br />
void RemoveRegion(Scene scene);<br />
}<br />
<br />
public interface ISharedRegionModule : IRegionModuleBase<br />
{<br />
void PostInitialise();<br />
}<br />
<br />
public interface INonSharedRegionModule : IRegionModuleBase<br />
{<br />
}<br />
<br />
* Loading the region-modules' classes happens via ''Mono.Addins'' on server-start. <br />
* Instantiating the region-modules happens...<br />
** for ''ISharedRegionModule''s once after loading (on server start)<br />
** for ''INonSharedRegionModule''s after creation of the ''Scene'' object.<br />
* You can cleanup when a region is removed.<br />
* You can cleanup before the server shuts down.<br />
<br />
;Note:<br />
:A ''PostInitialise'' for a ''INonSharedRegionModule'' doesn't make a lot of sense, as we don't have a certain point from which on we won't call ''Initialise'' on a ''INonSharedRegionModule'' again. Every time a new region is added (on restart, too), a new instance is created and ''Initialise'' is called on that instance, so the intended semantics of ''PostInitialise'' will never apply.<br />
<br />
= Details =<br />
<br />
== Start of region-server ==<br />
<br />
* Region-server starts, the classes of all region-modules are loaded in no particular order<br />
* The ''Scene''s are instantiated.<br />
** For every ''ISharedRegionModule'', one instance is created and ''Initialise'' is called.<br />
** For every ''ISharedRegionModule'' instance, ''PostInitialise'' is called.<br />
** For every ''Scene'', for every ''INonSharedRegionModule'', a new instance is created and ''Initialise'' called.<br />
** For every ''Scene'', for every ''INonSharedRegionModule'' and ''ISharedRegionModule'', ''AddRegion(scene)'' is called. The modules are associated to the ''Scene'' (for deletion on remove)<br />
<br />
<br />
== Adding a region ==<br />
<br />
* For every ''INonSharedRegionModule'', a new ''INonSharedRegionModule'' instance is created and ''Initialise'' is called<br />
* The new ''Scene'' object is created.<br />
* For every ''INonSharedRegionModule'' and ''ISharedRegionModule'', ''AddRegion(scene)'' is called. The modules are associated to the ''Scene'' (for deletion on remove)<br />
<br />
== Removing a region ==<br />
<br />
* For every ''INonSharedRegionModule'' of the scene and every ''ISharedRegionModule'', ''RemoveRegion(scene)'' is called<br />
* For every ''INonSharedRegionModule'' of the scene, ''Close'' is called<br />
* Every module reference of the scene is removed from the scene. No references should be left after that; the ''INonSharedRegionModule''s could be garbage collected now.<br />
<br />
<br />
== Restarting a region ==<br />
<br />
For simplicity, I'd like to do this as a [[#Removing_a_region|"Removing a region"]], followed by a<br />
[[#Adding_a_region|"Adding a region"]]. Is there a functional reason for not doing that?<br />
<br />
: what happens to avatars that are in a region that you want to restart then? are they kicked out first? should they stay? --- [[User:DrScofield|DrScofield]] 09:51, 26 January 2009 (UTC)<br />
<br />
== Shutdown of the region-server ==<br />
<br />
* For every scene, perform the [[#Removing_a_region|"Removing a region"]] step:<br />
** ''RemoveRegion'' is called for all scenes and modules<br />
** ''Close'' is called for all the ''INonSharedRegionModule''s<br />
* ''Close'' is called for all the ''ISharedRegionModule''. Possible book-keeping references are removed; the ''ISharedRegionModule'' could now be garbage-collected.<br />
<br />
<br />
= Questions =<br />
* Loading via Mono.Addins? Via ExtensionLoader? Via our own loader (like the current one)?<br />
* Configuration about which modules should be loaded?</div>DrScofieldhttp://opensimulator.org/wiki/New_Region_ModulesNew Region Modules2009-01-26T09:48:37Z<p>DrScofield: otherwise it doesn't make sense</p>
<hr />
<div>(This is a first draft-version and can change at any time until complete<br />
implementation. Feel free to comment, either on the Discussion page or on the<br />
opensim-dev mailing list)<br />
<br />
= Why =<br />
<br />
The current RegionModule system's API is in part inconsistent and doesn't<br />
really support region-restarts and adding/removing regions on the fly during<br />
a region-server run.<br />
E.g., the API says ''Initialise'' is called for every region (in every<br />
region-module), after that, ''PostInitialise'' is called for every region-module.<br />
When a new region is added, what should happen?<br />
* Don't call ''Initialise'': Then the region-module isn't initialised for that region, which leads to missing functionality.<br />
* Call ''Initialise'': Then ''PostInitialise'' was called too early. Actually, ''PostInitialise'' can not be called at all, because you can add a region after that anytime.<br />
<br />
What should happen if a region is restarted? What should happen if a region<br />
is removed?<br />
<br />
<br />
= What =<br />
<br />
The new region-module system is based on three interfaces: ''ISharedRegionModule'',<br />
''INonSharedRegionModule'' and ''IRegionModuleBase'', which is the base interface for<br />
the other two.<br />
<br />
public interface IRegionModuleBase<br />
{<br />
string Name { get; }<br />
void Initialise(IConfigSource source);<br />
void Close();<br />
void AddRegion(Scene scene);<br />
void RemoveRegion(Scene scene);<br />
}<br />
<br />
public interface ISharedRegionModule : IRegionModuleBase<br />
{<br />
void PostInitialise();<br />
}<br />
<br />
public interface INonSharedRegionModule : IRegionModuleBase<br />
{<br />
}<br />
<br />
* Loading the region-modules' classes happens via ''Mono.Addins'' on server-start. <br />
* Instantiating the region-modules happens...<br />
** for ''ISharedRegionModule''s once after loading (on server start)<br />
** for ''INonSharedRegionModule''s after creation of the ''Scene'' object.<br />
* You can cleanup when a region is removed.<br />
* You can cleanup before the server shuts down.<br />
<br />
;Note:<br />
:A ''PostInitialise'' for a ''INonSharedRegionModule'' doesn't make a lot of sense, as we don't have a certain point from which on we won't call ''Initialise'' on a ''INonSharedRegionModule'' again. Every time a new region is added (on restart, too), a new instance is created and ''Initialise'' is called on that instance, so the intended semantics of ''PostInitialise'' will never apply.<br />
<br />
= Details =<br />
<br />
== Start of region-server ==<br />
<br />
* Region-server starts, the classes of all region-modules are loaded in no particular order<br />
* The ''Scene''s are instantiated.<br />
** For every ''ISharedRegionModule'', one instance is created and ''Initialise'' is called.<br />
** For every ''ISharedRegionModule'' instance, ''PostInitialise'' is called.<br />
** For every ''Scene'', for every ''INonSharedRegionModule'', a new instance is created and ''Initialise'' called.<br />
** For every ''Scene'', for every ''INonSharedRegionModule'' and ''ISharedRegionModule'', ''AddRegion(scene)'' is called. The modules are associated to the ''Scene'' (for deletion on remove)<br />
<br />
<br />
== Adding a region ==<br />
<br />
* For every ''INonSharedRegionModule'', a new ''INonSharedRegionModule'' instance is created and ''Initialise'' is called<br />
* The new ''Scene'' object is created.<br />
* For every ''INonSharedRegionModule'' and ''ISharedRegionModule'', ''AddRegion(scene)'' is called. The modules are associated to the ''Scene'' (for deletion on remove)<br />
<br />
== Removing a region ==<br />
<br />
* For every ''INonSharedRegionModule'' of the scene and every ''ISharedRegionModule'', ''RemoveRegion(scene)'' is called<br />
* For every ''INonSharedRegionModule'' of the scene, ''Close'' is called<br />
* Every module reference of the scene is removed from the scene. No references should be left after that; the ''INonSharedRegionModule''s could be garbage collected now.<br />
<br />
<br />
== Restarting a region ==<br />
<br />
For simplicity, I'd like to do this as a [[#Removing_a_region|"Removing a region"]], followed by a<br />
[[#Adding_a_region|"Adding a region"]]. Is there a functional reason for not doing that?<br />
<br />
<br />
== Shutdown of the region-server ==<br />
<br />
* For every scene, perform the [[#Removing_a_region|"Removing a region"]] step:<br />
** ''RemoveRegion'' is called for all scenes and modules<br />
** ''Close'' is called for all the ''INonSharedRegionModule''s<br />
* ''Close'' is called for all the ''ISharedRegionModule''. Possible book-keeping references are removed; the ''ISharedRegionModule'' could now be garbage-collected.<br />
<br />
<br />
= Questions =<br />
* Loading via Mono.Addins? Via ExtensionLoader? Via our own loader (like the current one)?<br />
* Configuration about which modules should be loaded?</div>DrScofieldhttp://opensimulator.org/wiki/IRegionModuleIRegionModule2008-11-17T10:29:33Z<p>DrScofield: adding caveat to PostInitialise()</p>
<hr />
<div>{{content}}<br />
== Introduction ==<br />
A key design principle of OpenSim is the heavy use of plug-ins. All the key components of OpenSim are designed to be replaceable or extensible at runtime.<br />
<br />
* Database engines can be replaced (currently OpenSim has full support for)<br />
** SQLite<br />
** MySQL<br />
** MS-SQL Server is fairly complete but largely untested.<br />
<br />
* Backend servers can be replaced by changing a url, currently there are servers for:<br />
** User authentication<br />
** Grid registration<br />
** Asset storage<br />
** Inventory storage<br />
** Messaging storage<br />
** Script execution<br />
<br />
* Script languages can be replaced<br />
* ''Region modules can be added''<br />
<br />
Region modules are .net/mono dlls. During initialization of the simulator, the current directory (/bin) and the scriptengines (/ScriptEngines) directory are scanned for dlls, in an attempt to load region modules stored there.<br />
<br />
Region modules execute within the heart of the simulator. Typically region modules register for a number of events, e.g. chat messages, user logins, texture transfers, and take what ever steps are appropriate for the purposes of the module.<br />
<br />
Region Modules require a few basic things:<br />
* The Base Interface <br />
* Some callbacks for OpenSim events<br />
<br />
== The Base Interface ==<br />
All region modules must implement this interface:<br />
<br />
<source lang="csharp"><br />
public interface IRegionModule<br />
{<br />
void Initialise(Scene scene, IConfig config);<br />
void PostInitialise();<br />
void Close();<br />
string Name { get; }<br />
bool IsSharedModule { get; }<br />
}<br />
</source><br />
<br />
<table><br />
<tr><br />
<th>Name</th><br />
<th>Description</th><br />
</tr><br />
<tr><br />
<td>Initialise</td><br />
<td>This method is called immediately after the region module has been loaded by the sim. At this time the module is passed a reference to the scene contained within the sim. The region module should store this reference for later use. Care should be taken, not to depend on the scene and/or sim being fully loaded and running at this time. <br />
</td><br />
</tr><br />
<tr><br />
<td>PostInitialise</td><br />
<td>Once the sim is fully initialized and all region modules have been loaded, the sim will invoke PostInitialize on all loaded region modules. At this point the sim will be fully operational, and it should be safe to invoke any method on the scene. <b>Note:</b> PostInitialize will not be invoked on shared modules for regions created via XmlRpcCreateRegion or via the console command "create-region"!</td><br />
</tr><br />
<tr><br />
<td>Close</td><br />
<td>This method will be invoked when the sim is closing down.</td><br />
</tr><br />
<tr><br />
<td>Name</td><br />
<td>This name is shown when the console command "show modules" is ran. It's should be a nice name like "Sim Chat Module" or "The Best Region Module Ever".</td><br />
</tr><br />
<tr><br />
<td>IsSharedModule</td><br />
<td>The simulator process (OpenSim.exe) supports running multiple regions (internally, a Scene object) on a single simulator process. If this returns True, the module will only be loaded once and Initialize will be called for each Scene being simulated. If false, a separate copy of your RegionModule will be created for each Scene.</td><br />
</tr><br />
</table><br />
<br />
The base interface doesn't give you much beyond a piece of loaded code. In order to do anything useful you'll need to use a combination of events and object crawling through scene.<br />
<br />
== Accessible Objects ==<br />
<br />
'''Note:''' these are internal interfaces, and will change in the future, probably for the better. We expect these to stabalize over time, but for now this point in time snapshot is probably helpful.<br />
<br />
In the '''Initialise''' routine you get access to the scene object for the region, from here you can spider down into the scene and get access to many other objects of interest.<br />
<br />
* scene.GetEntities() - returns a list of all the Entities in the environment. This will be a combined list of SceneObjectGroups (prim sets) and ScenePresences (avatars).<br />
* scene.GetAvatars() - get only the avatars in the scene (very handy for sending messages to clients)<br />
* scene.EventManager - this is the object from which you can register callbacks for scene events. Some examples provided in a little bit<br />
* scene.RegionInfo - properties about the region<br />
<br />
== Registering for Events ==<br />
<br />
Taking the [http://opensimulator.org/cgi-bin/viewcvs.cgi/trunk/OpenSim/Region/Environment/Modules/World/Sun/SunModule.cs?view=markup SunModule] as an example we can see the following code:<br />
<br />
In Initialise():<br />
<source lang="csharp"><br />
...<br />
m_scene.EventManager.OnFrame += SunUpdate;<br />
...<br />
</source><br />
Pretty simple, we just got the EventManager and registered the SunUpdate method as a callback for the OnFrame event. OnFrame is triggered every time there is a render frame in opensim, which is about 20 times per second. If you are firing on the OnFrame event you need to do something small, or punt most of the time, as you'll negatively impact the performance of the system otherwise.<br />
<br />
Now, for that function...<br />
<br />
<source lang="csharp"><br />
public void SunUpdate()<br />
{<br />
// this code just means only do this on every 1000th frame, and don't do it if the sun is in a fixed possition<br />
if (((m_frame++%m_frame_mod) != 0) || !ready || sunFixed)<br />
{<br />
return;<br />
}<br />
<br />
GenSunPos(); // Generate shared values once<br />
<br />
List<ScenePresence> avatars = m_scene.GetAvatars();<br />
foreach (ScenePresence avatar in avatars)<br />
{<br />
if (!avatar.IsChildAgent)<br />
avatar.ControllingClient.SendSunPos(Position, Velocity, CurrentTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);<br />
}<br />
<br />
// set estate settings for region access to sun position<br />
m_scene.RegionInfo.RegionSettings.SunVector = Position;<br />
}<br />
</source><br />
<br />
SunUpdate() takes no parameter (some events may require them). It only fires every 1000th frame by default (m_frame_mod = 1000 in this module), so it doesn't take too many cycles.<br />
<br />
In order for the sun position to change for the clients, they need to be told that it changes. This is done by getting a list of all the Avatars from the scene, then sending the Sun Position to each of them in turn. It is important to check to see if the avatar is a ChildAgent, otherwise you will generate zombies in opensim world.<br />
<br />
== Where to go from here ==<br />
<br />
* Read the source for existing modules. You can do it here via [http://opensimulator.org/cgi-bin/viewcvs.cgi/trunk/OpenSim/Region/Environment/Modules view svn].<br />
* Read the source for [http://opensimulator.org/cgi-bin/viewcvs.cgi/trunk/OpenSim/Region/Environment/Scenes/EventManager.cs?view=markup EventManager]. It will tell you what events exist.<br />
* Help write more examples here. OpenSim grows with your contributions.<br />
<br />
[[Category:Development]]</div>DrScofieldhttp://opensimulator.org/wiki/ConfigurationConfiguration2008-11-04T15:55:16Z<p>DrScofield: added configuration of region modules section</p>
<hr />
<div>==OpenSim configuration file==<br />
The simulator configuration is managed using a file called [[OpenSim.ini]]. This file is used regardless of whether the sim is running in standalone or grid mode. Detailed information on the options available for setttings in this file can be found [[OpenSim.ini|here]].<br />
<br />
==Database==<br />
Opensim's supports the following database-engines:<br />
* SQLite (default - a lightweight database that comes bundled with OpenSim and can be used without requiring any extra configuration. It is mostly intended to get you up and running quickly, not for production use.)<br />
* MySQL (fully supported)<br />
* MSSQL (partially supported - some recent OpenSim features may not yet be implemented)<br />
<br />
More information on database support can be found on the [[OpenSim Database support]] page.<br />
<br />
==Script engine==<br />
OpenSim supports multiple script engines. See [[ScriptEngines]] for details<br />
<br />
==Standalone vs. Grid==<br />
We recommend that you first get OpenSim running in standalone mode before you attempt to connect it to a grid, either your own grid or a public grid. An OpenSim configuration consists of regions (run by region simulators) and 5 core backend services (which manage users, the grid, assets, inventories, and grid-wide messaging, collectively known as UGAIM).<br />
<br />
A system running in '''standalone mode''' (that is, one with OpenSim.ini configured such that gridmode = false) -- also known as "sandbox mode" -- runs everything (all UGAIM services and one or more regions) in a single executable (OpenSim.exe). External regions cannot be added to an OpenSim running in this mode.<br />
<br />
In '''grid mode''', the five services ([[User Server|User]], [[Grid Server|Grid]], [[Asset Server|Asset]], [[Inventory Server|Inventory]], [[Messaging Server|Messaging]], or UGAIM) are each started as separate executables. This means that they can be run either on the same machine or spread out across multiple computers. In this mode, OpenSim.exe serves one or more regions, which communicate with the core servers. This mode even allows region servers run by other people on their own machines to connect, if you wish.<br />
<br />
Naturally, this means that running in grid mode is somewhat more complicated than running in standalone mode. It requires an understanding of UUID, X,Y location, server handshake passwords, master avatars, and a couple of other settings. These are not difficult, but do require a little more care in setting things up.<br />
<br />
If you want to run a grid of your own (either private or public) you would start the core services up before connecting a region simulator. If you want to connect your region server to a grid that someone else is running, you need only start the region server in grid mode (with the necessary security keys and location information mentioned in the last paragraph).<br />
<br />
OpenSim.exe responds to various command line arguments. These include "-inifile", "-configfile", "-gridmode", "-physics", "-config" & "-noverbose". When starting OpenSim in either Windows or Linux, one could, for example, add "-physics=OpenDynamicsEngine" to run the OpenDynamicsEngine instead of basicphysics, or use "-gridmode=true" to force opensim.exe to run as a region server (the rest of the grid services have their own executables). As many of these settings are normally controlled by OpenSim.ini, most users (especially in standalone mode) will not add any command line arguments.<br />
<br />
===Standalone mode===<br />
<br />
When you start OpenSim in standalone mode, it will ask you several questions at the console. The first set of prompts that start with "NETWORK SERVERS INFO", you can just hit return to accept the defaults if you will be running in standalone mode. The prompts that start with "DEFAULT REGION CONFIG" are where you need to start paying attention. Some are self-explanatory. Here are explanations for the others:<br><br />
* Grid Location. OpenSim regions can be placed anywhere on a 65536 by 65536 grid. In standalone mode, it is safe to leave these X and Y locations at their defaults for the first region (additional regions will need different coordinates, of course).<br />
* Filename for local storage. Safe to leave at default.<br />
* Internal IP address; This should always be 0.0.0.0 (0.0.0.0 means "listen for connections on any interface", basically a wildcard)<br />
* Internal IP port for incoming UDP client connection. You can make this any port you want, but it is safe to leave at the default 9000.<br />
* External host name. If you will only be attaching to your sim from a SecondLife client on the same machine, you can leave this at the default 127.0.0.1. If you will be wanting to connect to it from a client on another machine, this should be the IP address or hostname of the machine you are running this sim on. N.B - It appears that this must actually be the External Host IP Address, not the Domain Name.<br />
To connect to your new sim, start up secondlife with the following command line switches:<br />
-loginuri http://127.0.0.1:9000/ -loginpage http://127.0.0.1:9000/?method=login <br />
This assumes you are running the secondlife client on the same box. If you are running it on a separate box, substitute the IP address of your sim machine.<br><br />
To create a user:<br><br />
type ''create user <first> <last> <password> <x_loc> <y_loc>'' in the server console.<br />
<br />
===Grid mode===<br />
You want to run your own grid. Great! Assuming that you already got your sim running in standalone mode, here is what you need to do:<br><br />
1. Current builds of OpenSim grid mode are using mysql to store the grid information. You must have this installed and configured if you want to run your own grid. See [[mysql-config]] for more information.<br><br />
2. Four of the servers should be started in a certain order. UGAI: UserServer, GridServer, AssetServer, InventoryServer. The MessagingServer can be started at any point after the GridServer, and the RegionServer(s) should always come last. These are all found in the bin directory. In windows, you can just double-click on the executables to start them. In Linux and Mac OS X type "mono filename" from a prompt. The executable names, in order, are:<br />
OpenSim.Grid.UserServer.exe<br />
OpenSim.Grid.GridServer.exe<br />
OpenSim.Grid.AssetServer.exe<br />
OpenSim.Grid.InventoryServer.exe<br />
OpenSim.Grid.MessagingServer.exe<br />
OpenSim.exe<br />
3. Start the UserServer. If you will be running the GridServer on the same box, hit enter to accept the defaults, until it gives you the prompt<br />
OpenUser#<br />
This is the main prompt for the user server. If you will be running the GridServer on another box, change the Default Grid Server URI as appropriate.<br><br />
4. Start the GridServer. Again, you can hit return at all the prompts if you are running them all on the same machine. If not, change the URIs for the Asset Server and User server to point to where you are running them. You will finally get to the console prompt for the GridServer which looks like this:<br />
OpenGrid#<br />
5. Start the AssetServer. The console prompt for this server will be:<br />
OpenAsset#<br />
6. Start the InventoryServer. The console prompt for this server will be:<br />
INVENTORY#<br />
7. Start the MessagingServer. The console prompt for this is:<br />
Messaging#<br />
8. If you are running all of these servers on the same box, which would be the normal configuration, you should be ready to start up your sim. The mode that OpenSim.exe starts in is normally controlled by a setting in your OpenSim.ini. It defaults to standalone mode if that setting is not specified or the file is not found. If you wish, you can force opensim to start in gridmode on the command line as follows:<br />
OpenSim.exe -gridmode=true<br />
or:<br />
mono OpenSim.exe -gridmode=true<br />
With any luck, everything will come up without too many errors.<br><br />
9. Go to the UserServer console, and type 'create user' to create a new avatar. It will prompt you for the name and password, and the X and Y of the sim that should be his home location. Use 1000 and 1000, or wherever you told your sim to live when you brought it up in standalone mode. At the console of any of these servers, you should be able to type 'help' to get a list of commands.<br />
<br />
You should now be able to connect to your new grid with your secondlife client. You need to tell your client to point at the UserServer rather than directly at the sim, though:<br />
secondlife -loginuri http://127.0.0.1:8002/<br />
8002 is the default port for the UserServer, and that IP address should be changed to the server you are running the UserServer on, if they are not all on the same box. Happy OpenSimming!<br><br />
''Note: if you are using Windows Vista, remember to start servers as Admin. If not it will prompt you an error in console like "Error - Access denied"''<br />
<br />
==Multiple regions==<br />
<br />
Using Physical Prim with the OpenDynamicsEngine on *nix, it's recommended that you set your stack reserve level higher then default with the following command;<br />
<tt>ulimit -s 262144</tt> Or, run the opensim-ode.sh to start up OpenSimulator.<br />
<br />
A powerful region generator is available at: [[RegionGenerator]]<br />
<br />
For running multiple regions on the same box, you simply make multiple copies of the 'default.xml' file inside the <tt>bin/Regions/</tt> directory. You can do this using the script <tt>make.php</tt> in <tt>share/regions</tt>, or you can generate the files by hand.<br />
<br />
If you want to create the files by hand:<br />
<br />
:first copy the default.xml file in the <tt>bin/Regions</tt> directory, and name them anything you want (I name mine region.x.y.xml, where region is the name of the region, and x and y are the grid coords.)<br />
:Open each xml file and edit the uuid (a generator can be found at [http://www.famkruithof.net/uuid/uuidgen uuidgen webpage] or on unix, use the uuidgen command), region name, x & y positions, and internal ip port. IMPORTANT! The UUID, name, and grid coordinates ''must'' be unique for each region on a grid. The port assignment must be unique for each region that is running on a particular machine.<br><br />
<br />
Note that <tt>sim_location_x</tt> and <tt>sim_location_y</tt> should be adjacent integers if you want your regions to be adjacent, so you can run back and forth between them. '''IMPORTANT: THESE GRID COORDINATES ARE ''NOT'' IN METERS. THEY ARE SIM POSITIONS.''' (1000, 1000) is next to (1001,1000), (1000, 1001), and so forth. 1256, 2000, 2048 and similar values are '''not''' adjacent to 1000, they are very far away, so you would not see your sims from one another.<br />
<br />
Once you have 2 or more xml files in the bin/Regions folder, running a ''single'' copy of <tt>OpenSim.exe</tt> will start up all of your sims! If you come across any errors, there is most likely an error in your xml files.<br />
<br />
As of 6-Feb-2008, take care NOT to leave editor backup copies of the files in this directory e.g. emacs style backup names like Regionname.xml~. These are loaded by opensim.exe as if they are legitimate region descriptions, and will therefore give errors indicating you are trying to re-use the socket for that region.<br />
<br />
==Attaching your sim to someone else's grid==<br />
To set up the region server (i.e., <tt>OpenSim.exe</tt>) to connect to an external grid, you should edit the <tt>OpenSim.ini</tt> file in the <tt>bin</tt> directory. In that file, there is a <tt>[Network]</tt> section with URLs for the grid, user, and asset servers, as well as send and receive keys (for a basic level of security). The addresses and send/receive keys will vary depending on the grid you are connecting to, and the grid operator should tell you what values to use.<br />
<br />
The other file you may have to change is in your <tt>bin/Regions</tt> directory. This is where your individual region config files are. If you only have one region, it will by default be called <tt>default.xml</tt>.<br />
<br />
This can be edited with any text editor. The grid owner may tell you what X and Y location you can place your sim at (you can't have multiple sims at the same location on the grid). If so, the fields you will need to change in this file are <tt>sim_location_x</tt> and <tt>sim_location_y</tt>. And the <tt>external_host_name</tt> should be set to the hostname or IP address of your simulation server (i.e., the machine that is running <tt>OpenSim.exe</tt>).<br />
A list of public grids that you can attach your sim to is at [[OpenSim: Grids]]<br />
<br />
==Running==<br />
<br />
===StandAlone===<br />
'''<u>Windows</u>'''<br />
cd bin<br />
OpenSim.exe<br />
On Windows Vista, it may be necessary to explicitly "Run as administrator" for opensim.exe to accept connections from a client, even when running as an administrator user. Navigate to the opensim\bin directory, right click opensim.exe, and select "Run as administrator".<br />
Connect: opensim://localhost:9000 , or opensim://127.0.0.1:9000, or opensim://myipadress:9000<br />
<br />
'''<u>Linux</u>'''<br />
cd bin<br />
mono OpenSim.exe<br />
<br />
'''<u>OSX</u>'''<br />
cd bin<br />
mono OpenSim.exe<br />
<br />
===Local Grid===<br />
'''<u>Windows</u>'''<br />
cd bin<br />
OpenSim.Grid.UserServer.exe<br />
OpenSim.Grid.GridServer.exe<br />
OpenSim.Grid.AssetServer.exe<br />
OpenSim.Grid.InventoryServer.exe<br />
OpenSim.Grid.MessagingServer.exe<br />
OpenSim.exe<br />
<br />
'''<u>Linux</u>'''<br />
cd bin<br />
mono OpenSim.Grid.UserServer.exe<br />
mono OpenSim.Grid.GridServer.exe<br />
mono OpenSim.Grid.AssetServer.exe<br />
mono OpenSim.Grid.InventoryServer.exe<br />
mono OpenSim.Grid.MessagingServer.exe<br />
mono OpenSim.exe<br />
<br />
'''<u>OSX</u>''''<br />
cd bin<br />
mono OpenSim.Grid.UserServer.exe<br />
mono OpenSim.Grid.GridServer.exe<br />
mono OpenSim.Grid.AssetServer.exe<br />
mono OpenSim.Grid.InventoryServer.exe<br />
mono OpenSim.Grid.MessagingServer.exe<br />
mono OpenSim.exe<br />
Connect: opensim://myipaddress:9000<br />
<br />
== Configuration of region modules ==<br />
<br />
* [[IRCBridgeModule]]</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T15:52:34Z<p>DrScofield: /* irc_admin XmlRpc method */</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in [[#Traditional IRCBridge mode|''traditional mode'']] where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in [[#Multi-channel mode|''multi-channel mode'']] where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in [[#Object chat relay mode|''object chat relay mode'']] where we only relay chat to and from private in-world channels<br />
<br />
In addition, we can [[#In-World Configuration|send commands]] to <code>IRCBridge</code> from in-world objects to re-configure <code>IRCBridge</code><br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
access_password = WuffWuff<br />
<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
== Multi-channel mode ==<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" <br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.<br />
<br />
== Object chat relay mode ==<br />
<br />
In object chat relay mode <code>IRCBridge</code> relays messages from<br />
and to in-world channels.<br />
<br />
To configure <code>IRCBridge</code> for this mode you need to use the<br />
following configuration:<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = false<br />
report_clients = false<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
<br />
relay_private_channels = true<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
The important configuration variables here are:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| relay_chat <br />
| needs to be disabled (well, you can keep it enabled if your in-world<br />
objects are silent and do not repeat what they heard)<br />
|-<br />
| report_clients<br />
| doesn’t really make sense if you’ve disabled relay_chat<br />
|-<br />
| relay_private_channels<br />
| needs to be set to “true”<br />
|-<br />
| relay_private_channel_in<br />
| all traffic from the IRC channel will be send on this private<br />
channel in-world<br />
|-<br />
| relay_private_channel_out<br />
| all chat on this private in-world channel is relayed to the IRC<br />
channel <br />
|-<br />
| access_password<br />
| set this to a password of your choice<br />
|-<br />
|}<br />
<br />
Your in-world objects then need to use LSL code along the following lines:<br />
<br />
<pre><br />
llSay(command_channel, “access_password,from,message”);<br />
</pre><br />
<br />
to send messages to the IRC channel.<br />
<br />
== In-World configuration ==<br />
<br />
The last feature worth mentioning is that you can control <code>IRCBridge</code> from in-world by sending commands on a specific command channel. <br />
<br />
To enable this feature you need to use the following configuration instructions:<br />
<br />
<pre><br />
commands_enabled = true<br />
command_channel = 4711<br />
</pre><br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| commands_enabled<br />
| needs to be “true”<br />
|-<br />
| command_channel<br />
| set this to the private in-world channel number that you want to use<br />
|}<br />
<br />
<code>IRCBridge</code> understands the following commands:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| server hostname<br />
| change to the new IRC server “hostname”<br />
|-<br />
| port port-number<br />
| change the port used to connect to the IRC server<br />
|-<br />
| channel channel-name<br />
| change the channel name used<br />
|-<br />
| nick new-nick<br />
| change the nick name used<br />
|-<br />
| client-reporting true|false<br />
| enable client reporting<br />
|- <br />
| in-channel channel-number<br />
| change relay_private_channel_in to channel-number<br />
|-<br />
| out-channel channel-number<br />
| change relay_private_channel_out to channel-number<br />
|-<br />
| close<br />
| close the IRC connection<br />
|-<br />
| connect<br />
| open the IRC connection<br />
|-<br />
| reconnect<br />
| close and re-open the IRC connection<br />
|}<br />
<br />
== irc_admin XmlRpc method ==<br />
<br />
<code>IRCBridge</code> supports one XmlRpc method that allows you to obtain the <code>IRCBridge</code>configuration for a specific region. To enable this method you need to enable the <code>[RemoteAdmin]</code> module.<br />
<br />
<code>irc_admin</code> expects two parameters:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| password<br />
| the RemoteAdmin password<br />
|-<br />
| region<br />
| the region name for which you want to the IRC configuration<br />
|-<br />
|}<br />
<br />
it will return <br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| server<br />
| the server name<br />
|-<br />
| port<br />
| the port name<br />
|-<br />
| user<br />
| the IRC user name being used<br />
|-<br />
| channel<br />
| the channel name being used<br />
|-<br />
| enabled<br />
| whether the IRC relay is enabled or not<br />
|-<br />
| connected<br />
| whether the IRC relay is connected or not<br />
|-<br />
| nickname<br />
| the current nickname<br />
|}<br />
<br />
here is sample python code showing how to invoke <code>irc_admin</code>:<br />
<br />
<pre><br />
import xmlrpclib<br />
s = xmlrpclib.Server('http://opensim.zurich.ibm.com:9000/admin')<br />
print s.irc_admin(dict(password = 'c00lstuff', region = 'zurela'))<br />
<br />
{'channel': '#opensim-lotus3d-zurela-opensim.zurich.ibm.com',<br />
'connected': True,<br />
'enabled': True,<br />
'nickname': 'lotus3dbot66',<br />
'port': '',<br />
'server': 'zurich.irc.ibm.com',<br />
'success': True,<br />
'user': "USER OpenSimBot 8 * :I'm an OpenSim to IRC bot"}<br />
</pre></div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T15:51:48Z<p>DrScofield: added python sample code</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in [[#Traditional IRCBridge mode|''traditional mode'']] where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in [[#Multi-channel mode|''multi-channel mode'']] where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in [[#Object chat relay mode|''object chat relay mode'']] where we only relay chat to and from private in-world channels<br />
<br />
In addition, we can [[#In-World Configuration|send commands]] to <code>IRCBridge</code> from in-world objects to re-configure <code>IRCBridge</code><br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
access_password = WuffWuff<br />
<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
== Multi-channel mode ==<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" <br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.<br />
<br />
== Object chat relay mode ==<br />
<br />
In object chat relay mode <code>IRCBridge</code> relays messages from<br />
and to in-world channels.<br />
<br />
To configure <code>IRCBridge</code> for this mode you need to use the<br />
following configuration:<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = false<br />
report_clients = false<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
<br />
relay_private_channels = true<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
The important configuration variables here are:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| relay_chat <br />
| needs to be disabled (well, you can keep it enabled if your in-world<br />
objects are silent and do not repeat what they heard)<br />
|-<br />
| report_clients<br />
| doesn’t really make sense if you’ve disabled relay_chat<br />
|-<br />
| relay_private_channels<br />
| needs to be set to “true”<br />
|-<br />
| relay_private_channel_in<br />
| all traffic from the IRC channel will be send on this private<br />
channel in-world<br />
|-<br />
| relay_private_channel_out<br />
| all chat on this private in-world channel is relayed to the IRC<br />
channel <br />
|-<br />
| access_password<br />
| set this to a password of your choice<br />
|-<br />
|}<br />
<br />
Your in-world objects then need to use LSL code along the following lines:<br />
<br />
<pre><br />
llSay(command_channel, “access_password,from,message”);<br />
</pre><br />
<br />
to send messages to the IRC channel.<br />
<br />
== In-World configuration ==<br />
<br />
The last feature worth mentioning is that you can control <code>IRCBridge</code> from in-world by sending commands on a specific command channel. <br />
<br />
To enable this feature you need to use the following configuration instructions:<br />
<br />
<pre><br />
commands_enabled = true<br />
command_channel = 4711<br />
</pre><br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| commands_enabled<br />
| needs to be “true”<br />
|-<br />
| command_channel<br />
| set this to the private in-world channel number that you want to use<br />
|}<br />
<br />
<code>IRCBridge</code> understands the following commands:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| server hostname<br />
| change to the new IRC server “hostname”<br />
|-<br />
| port port-number<br />
| change the port used to connect to the IRC server<br />
|-<br />
| channel channel-name<br />
| change the channel name used<br />
|-<br />
| nick new-nick<br />
| change the nick name used<br />
|-<br />
| client-reporting true|false<br />
| enable client reporting<br />
|- <br />
| in-channel channel-number<br />
| change relay_private_channel_in to channel-number<br />
|-<br />
| out-channel channel-number<br />
| change relay_private_channel_out to channel-number<br />
|-<br />
| close<br />
| close the IRC connection<br />
|-<br />
| connect<br />
| open the IRC connection<br />
|-<br />
| reconnect<br />
| close and re-open the IRC connection<br />
|}<br />
<br />
== irc_admin XmlRpc method ==<br />
<br />
<code>IRCBridge</code> supports one XmlRpc method that allows you to obtain the <code>IRCBridge</code>configuration for a specific region. To enable this method you need to enable the <code>[RemoteAdmin]</code> module.<br />
<br />
<code>irc_admin</code> expects two parameters:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| password<br />
| the RemoteAdmin password<br />
|-<br />
| region<br />
| the region name for which you want to the IRC configuration<br />
|-<br />
|}<br />
<br />
it will return <br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| server<br />
| the server name<br />
|-<br />
| port<br />
| the port name<br />
|-<br />
| user<br />
| the IRC user name being used<br />
|-<br />
| channel<br />
| the channel name being used<br />
|-<br />
| enabled<br />
| whether the IRC relay is enabled or not<br />
|-<br />
| connected<br />
| whether the IRC relay is connected or not<br />
|-<br />
| nickname<br />
| the current nickname<br />
|}<br />
<br />
here is sample python code showing how to invoke <code>irc_admin</code>:<br />
<br />
<pre><br />
import xmlrpclib<br />
s = xmlrpclib.Server('http://opensim.zurich.ibm.com:9000/admin')<br />
print s.irc_admin(dict(password = 'c00lstuff', region = 'zurela'))<br />
<br />
{'channel': '#opensim-lotus3d-zurela-opensim.zurich.ibm.com',<br />
'connected': True,<br />
'enabled': True,<br />
'nickname': 'lotus3dbot66',<br />
'port': '',<br />
'server': 'zurich.irc.ibm.com',<br />
'success': True,<br />
'user': "USER OpenSimBot 8 * :I'm an OpenSim to IRC bot"}<br />
</pre></div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T15:49:00Z<p>DrScofield: /* irc_admin XmlRpc method */</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in [[#Traditional IRCBridge mode|''traditional mode'']] where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in [[#Multi-channel mode|''multi-channel mode'']] where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in [[#Object chat relay mode|''object chat relay mode'']] where we only relay chat to and from private in-world channels<br />
<br />
In addition, we can [[#In-World Configuration|send commands]] to <code>IRCBridge</code> from in-world objects to re-configure <code>IRCBridge</code><br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
access_password = WuffWuff<br />
<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
== Multi-channel mode ==<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" <br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.<br />
<br />
== Object chat relay mode ==<br />
<br />
In object chat relay mode <code>IRCBridge</code> relays messages from<br />
and to in-world channels.<br />
<br />
To configure <code>IRCBridge</code> for this mode you need to use the<br />
following configuration:<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = false<br />
report_clients = false<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
<br />
relay_private_channels = true<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
The important configuration variables here are:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| relay_chat <br />
| needs to be disabled (well, you can keep it enabled if your in-world<br />
objects are silent and do not repeat what they heard)<br />
|-<br />
| report_clients<br />
| doesn’t really make sense if you’ve disabled relay_chat<br />
|-<br />
| relay_private_channels<br />
| needs to be set to “true”<br />
|-<br />
| relay_private_channel_in<br />
| all traffic from the IRC channel will be send on this private<br />
channel in-world<br />
|-<br />
| relay_private_channel_out<br />
| all chat on this private in-world channel is relayed to the IRC<br />
channel <br />
|-<br />
| access_password<br />
| set this to a password of your choice<br />
|-<br />
|}<br />
<br />
Your in-world objects then need to use LSL code along the following lines:<br />
<br />
<pre><br />
llSay(command_channel, “access_password,from,message”);<br />
</pre><br />
<br />
to send messages to the IRC channel.<br />
<br />
== In-World configuration ==<br />
<br />
The last feature worth mentioning is that you can control <code>IRCBridge</code> from in-world by sending commands on a specific command channel. <br />
<br />
To enable this feature you need to use the following configuration instructions:<br />
<br />
<pre><br />
commands_enabled = true<br />
command_channel = 4711<br />
</pre><br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| commands_enabled<br />
| needs to be “true”<br />
|-<br />
| command_channel<br />
| set this to the private in-world channel number that you want to use<br />
|}<br />
<br />
<code>IRCBridge</code> understands the following commands:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| server hostname<br />
| change to the new IRC server “hostname”<br />
|-<br />
| port port-number<br />
| change the port used to connect to the IRC server<br />
|-<br />
| channel channel-name<br />
| change the channel name used<br />
|-<br />
| nick new-nick<br />
| change the nick name used<br />
|-<br />
| client-reporting true|false<br />
| enable client reporting<br />
|- <br />
| in-channel channel-number<br />
| change relay_private_channel_in to channel-number<br />
|-<br />
| out-channel channel-number<br />
| change relay_private_channel_out to channel-number<br />
|-<br />
| close<br />
| close the IRC connection<br />
|-<br />
| connect<br />
| open the IRC connection<br />
|-<br />
| reconnect<br />
| close and re-open the IRC connection<br />
|}<br />
<br />
== irc_admin XmlRpc method ==<br />
<br />
<code>IRCBridge</code> supports one XmlRpc method that allows you to obtain the <code>IRCBridge</code>configuration for a specific region. To enable this method you need to enable the <code>[RemoteAdmin]</code> module.<br />
<br />
<code>irc_admin</code> expects two parameters:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| password<br />
| the RemoteAdmin password<br />
|-<br />
| region<br />
| the region name for which you want to the IRC configuration<br />
|-<br />
|}<br />
<br />
it will return <br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| server<br />
| the server name<br />
|-<br />
| port<br />
| the port name<br />
|-<br />
| user<br />
| the IRC user name being used<br />
|-<br />
| channel<br />
| the channel name being used<br />
|-<br />
| enabled<br />
| whether the IRC relay is enabled or not<br />
|-<br />
| connected<br />
| whether the IRC relay is connected or not<br />
|-<br />
| nickname<br />
| the current nickname<br />
|}</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T15:48:25Z<p>DrScofield: /* In-World configuration */</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in [[#Traditional IRCBridge mode|''traditional mode'']] where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in [[#Multi-channel mode|''multi-channel mode'']] where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in [[#Object chat relay mode|''object chat relay mode'']] where we only relay chat to and from private in-world channels<br />
<br />
In addition, we can [[#In-World Configuration|send commands]] to <code>IRCBridge</code> from in-world objects to re-configure <code>IRCBridge</code><br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
access_password = WuffWuff<br />
<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
== Multi-channel mode ==<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" <br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.<br />
<br />
== Object chat relay mode ==<br />
<br />
In object chat relay mode <code>IRCBridge</code> relays messages from<br />
and to in-world channels.<br />
<br />
To configure <code>IRCBridge</code> for this mode you need to use the<br />
following configuration:<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = false<br />
report_clients = false<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
<br />
relay_private_channels = true<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
The important configuration variables here are:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| relay_chat <br />
| needs to be disabled (well, you can keep it enabled if your in-world<br />
objects are silent and do not repeat what they heard)<br />
|-<br />
| report_clients<br />
| doesn’t really make sense if you’ve disabled relay_chat<br />
|-<br />
| relay_private_channels<br />
| needs to be set to “true”<br />
|-<br />
| relay_private_channel_in<br />
| all traffic from the IRC channel will be send on this private<br />
channel in-world<br />
|-<br />
| relay_private_channel_out<br />
| all chat on this private in-world channel is relayed to the IRC<br />
channel <br />
|-<br />
| access_password<br />
| set this to a password of your choice<br />
|-<br />
|}<br />
<br />
Your in-world objects then need to use LSL code along the following lines:<br />
<br />
<pre><br />
llSay(command_channel, “access_password,from,message”);<br />
</pre><br />
<br />
to send messages to the IRC channel.<br />
<br />
== In-World configuration ==<br />
<br />
The last feature worth mentioning is that you can control <code>IRCBridge</code> from in-world by sending commands on a specific command channel. <br />
<br />
To enable this feature you need to use the following configuration instructions:<br />
<br />
<pre><br />
commands_enabled = true<br />
command_channel = 4711<br />
</pre><br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| commands_enabled<br />
| needs to be “true”<br />
|-<br />
| command_channel<br />
| set this to the private in-world channel number that you want to use<br />
|}<br />
<br />
<code>IRCBridge</code> understands the following commands:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| server hostname<br />
| change to the new IRC server “hostname”<br />
|-<br />
| port port-number<br />
| change the port used to connect to the IRC server<br />
|-<br />
| channel channel-name<br />
| change the channel name used<br />
|-<br />
| nick new-nick<br />
| change the nick name used<br />
|-<br />
| client-reporting true|false<br />
| enable client reporting<br />
|- <br />
| in-channel channel-number<br />
| change relay_private_channel_in to channel-number<br />
|-<br />
| out-channel channel-number<br />
| change relay_private_channel_out to channel-number<br />
|-<br />
| close<br />
| close the IRC connection<br />
|-<br />
| connect<br />
| open the IRC connection<br />
|-<br />
| reconnect<br />
| close and re-open the IRC connection<br />
|}<br />
<br />
== irc_admin XmlRpc method ==<br />
<br />
<code>IRCBridge</code> supports one XmlRpc method that allows you to obtain the <code>IRCBridge</code>configuration for a specific region. To enable this method you need to enable the <code>[RemoteAdmin]</code> module.<br />
<br />
<code>irc_admin</code> expects two parameters:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| password<br />
| the RemoteAdmin password<br />
|-<br />
| region<br />
| the region name for which you want to the IRC configuration<br />
|-<br />
|}<br />
<br />
it will return <br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| server<br />
| the server name<br />
|-<br />
| port<br />
| the port name<br />
|-<br />
| user<br />
| the IRC user name being used<br />
|-<br />
| channel<br />
| the channel name being used<br />
|-<br />
| enabled<br />
| whether the IRC relay is enabled or not<br />
|-<br />
| connected<br />
| whether the IRC relay is connected or not<br />
|-<br />
| nickname<br />
| the current nickname<br />
|}</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T15:47:52Z<p>DrScofield: /* Object chat relay mode */</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in [[#Traditional IRCBridge mode|''traditional mode'']] where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in [[#Multi-channel mode|''multi-channel mode'']] where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in [[#Object chat relay mode|''object chat relay mode'']] where we only relay chat to and from private in-world channels<br />
<br />
In addition, we can [[#In-World Configuration|send commands]] to <code>IRCBridge</code> from in-world objects to re-configure <code>IRCBridge</code><br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
access_password = WuffWuff<br />
<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
== Multi-channel mode ==<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" <br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.<br />
<br />
== Object chat relay mode ==<br />
<br />
In object chat relay mode <code>IRCBridge</code> relays messages from<br />
and to in-world channels.<br />
<br />
To configure <code>IRCBridge</code> for this mode you need to use the<br />
following configuration:<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = false<br />
report_clients = false<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
<br />
relay_private_channels = true<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
The important configuration variables here are:<br />
<br />
{| align="center" border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| relay_chat <br />
| needs to be disabled (well, you can keep it enabled if your in-world<br />
objects are silent and do not repeat what they heard)<br />
|-<br />
| report_clients<br />
| doesn’t really make sense if you’ve disabled relay_chat<br />
|-<br />
| relay_private_channels<br />
| needs to be set to “true”<br />
|-<br />
| relay_private_channel_in<br />
| all traffic from the IRC channel will be send on this private<br />
channel in-world<br />
|-<br />
| relay_private_channel_out<br />
| all chat on this private in-world channel is relayed to the IRC<br />
channel <br />
|-<br />
| access_password<br />
| set this to a password of your choice<br />
|-<br />
|}<br />
<br />
Your in-world objects then need to use LSL code along the following lines:<br />
<br />
<pre><br />
llSay(command_channel, “access_password,from,message”);<br />
</pre><br />
<br />
to send messages to the IRC channel.<br />
<br />
== In-World configuration ==<br />
<br />
The last feature worth mentioning is that you can control <code>IRCBridge</code> from in-world by sending commands on a specific command channel. <br />
<br />
To enable this feature you need to use the following configuration instructions:<br />
<br />
<pre><br />
commands_enabled = true<br />
command_channel = 4711<br />
</pre><br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| commands_enabled<br />
| needs to be “true”<br />
|-<br />
| command_channel<br />
| set this to the private in-world channel number that you want to use<br />
|}<br />
<br />
<code>IRCBridge</code> understands the following commands:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| server hostname<br />
| change to the new IRC server “hostname”<br />
|-<br />
| port port-number<br />
| change the port used to connect to the IRC server<br />
|-<br />
| channel channel-name<br />
| change the channel name used<br />
|-<br />
| nick new-nick<br />
| change the nick name used<br />
|-<br />
| client-reporting true|false<br />
| enable client reporting<br />
|- <br />
| in-channel channel-number<br />
| change relay_private_channel_in to channel-number<br />
|-<br />
| out-channel channel-number<br />
| change relay_private_channel_out to channel-number<br />
|-<br />
| close<br />
| close the IRC connection<br />
|-<br />
| connect<br />
| open the IRC connection<br />
|-<br />
| reconnect<br />
| close and re-open the IRC connection<br />
|}<br />
<br />
== irc_admin XmlRpc method ==<br />
<br />
<code>IRCBridge</code> supports one XmlRpc method that allows you to obtain the <code>IRCBridge</code>configuration for a specific region. To enable this method you need to enable the <code>[RemoteAdmin]</code> module.<br />
<br />
<code>irc_admin</code> expects two parameters:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| password<br />
| the RemoteAdmin password<br />
|-<br />
| region<br />
| the region name for which you want to the IRC configuration<br />
|-<br />
|}<br />
<br />
it will return <br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| server<br />
| the server name<br />
|-<br />
| port<br />
| the port name<br />
|-<br />
| user<br />
| the IRC user name being used<br />
|-<br />
| channel<br />
| the channel name being used<br />
|-<br />
| enabled<br />
| whether the IRC relay is enabled or not<br />
|-<br />
| connected<br />
| whether the IRC relay is connected or not<br />
|-<br />
| nickname<br />
| the current nickname<br />
|}</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T15:47:20Z<p>DrScofield: /* Multi-channel mode */</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in [[#Traditional IRCBridge mode|''traditional mode'']] where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in [[#Multi-channel mode|''multi-channel mode'']] where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in [[#Object chat relay mode|''object chat relay mode'']] where we only relay chat to and from private in-world channels<br />
<br />
In addition, we can [[#In-World Configuration|send commands]] to <code>IRCBridge</code> from in-world objects to re-configure <code>IRCBridge</code><br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
access_password = WuffWuff<br />
<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
== Multi-channel mode ==<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" <br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.<br />
<br />
== Object chat relay mode ==<br />
<br />
In object chat relay mode <code>IRCBridge</code> relays messages from<br />
and to in-world channels.<br />
<br />
To configure <code>IRCBridge</code> for this mode you need to use the<br />
following configuration:<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = false<br />
report_clients = false<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
<br />
relay_private_channels = true<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
The important configuration variables here are:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| relay_chat <br />
| needs to be disabled (well, you can keep it enabled if your in-world<br />
objects are silent and do not repeat what they heard)<br />
|-<br />
| report_clients<br />
| doesn’t really make sense if you’ve disabled relay_chat<br />
|-<br />
| relay_private_channels<br />
| needs to be set to “true”<br />
|-<br />
| relay_private_channel_in<br />
| all traffic from the IRC channel will be send on this private<br />
channel in-world<br />
|-<br />
| relay_private_channel_out<br />
| all chat on this private in-world channel is relayed to the IRC<br />
channel <br />
|-<br />
| access_password<br />
| set this to a password of your choice<br />
|-<br />
|}<br />
<br />
Your in-world objects then need to use LSL code along the following lines:<br />
<br />
<pre><br />
llSay(command_channel, “access_password,from,message”);<br />
</pre><br />
<br />
to send messages to the IRC channel.<br />
<br />
<br />
== In-World configuration ==<br />
<br />
The last feature worth mentioning is that you can control <code>IRCBridge</code> from in-world by sending commands on a specific command channel. <br />
<br />
To enable this feature you need to use the following configuration instructions:<br />
<br />
<pre><br />
commands_enabled = true<br />
command_channel = 4711<br />
</pre><br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| commands_enabled<br />
| needs to be “true”<br />
|-<br />
| command_channel<br />
| set this to the private in-world channel number that you want to use<br />
|}<br />
<br />
<code>IRCBridge</code> understands the following commands:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| server hostname<br />
| change to the new IRC server “hostname”<br />
|-<br />
| port port-number<br />
| change the port used to connect to the IRC server<br />
|-<br />
| channel channel-name<br />
| change the channel name used<br />
|-<br />
| nick new-nick<br />
| change the nick name used<br />
|-<br />
| client-reporting true|false<br />
| enable client reporting<br />
|- <br />
| in-channel channel-number<br />
| change relay_private_channel_in to channel-number<br />
|-<br />
| out-channel channel-number<br />
| change relay_private_channel_out to channel-number<br />
|-<br />
| close<br />
| close the IRC connection<br />
|-<br />
| connect<br />
| open the IRC connection<br />
|-<br />
| reconnect<br />
| close and re-open the IRC connection<br />
|}<br />
<br />
== irc_admin XmlRpc method ==<br />
<br />
<code>IRCBridge</code> supports one XmlRpc method that allows you to obtain the <code>IRCBridge</code>configuration for a specific region. To enable this method you need to enable the <code>[RemoteAdmin]</code> module.<br />
<br />
<code>irc_admin</code> expects two parameters:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| password<br />
| the RemoteAdmin password<br />
|-<br />
| region<br />
| the region name for which you want to the IRC configuration<br />
|-<br />
|}<br />
<br />
it will return <br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| server<br />
| the server name<br />
|-<br />
| port<br />
| the port name<br />
|-<br />
| user<br />
| the IRC user name being used<br />
|-<br />
| channel<br />
| the channel name being used<br />
|-<br />
| enabled<br />
| whether the IRC relay is enabled or not<br />
|-<br />
| connected<br />
| whether the IRC relay is connected or not<br />
|-<br />
| nickname<br />
| the current nickname<br />
|}</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T15:45:58Z<p>DrScofield: added XmlRpc info</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in [[#Traditional IRCBridge mode|''traditional mode'']] where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in [[#Multi-channel mode|''multi-channel mode'']] where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in [[#Object chat relay mode|''object chat relay mode'']] where we only relay chat to and from private in-world channels<br />
<br />
In addition, we can [[#In-World Configuration|send commands]] to <code>IRCBridge</code> from in-world objects to re-configure <code>IRCBridge</code><br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
access_password = WuffWuff<br />
<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
== Multi-channel mode ==<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align=”center” <br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align=”center” <br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.<br />
<br />
== Object chat relay mode ==<br />
<br />
In object chat relay mode <code>IRCBridge</code> relays messages from<br />
and to in-world channels.<br />
<br />
To configure <code>IRCBridge</code> for this mode you need to use the<br />
following configuration:<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = false<br />
report_clients = false<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
<br />
relay_private_channels = true<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
The important configuration variables here are:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| relay_chat <br />
| needs to be disabled (well, you can keep it enabled if your in-world<br />
objects are silent and do not repeat what they heard)<br />
|-<br />
| report_clients<br />
| doesn’t really make sense if you’ve disabled relay_chat<br />
|-<br />
| relay_private_channels<br />
| needs to be set to “true”<br />
|-<br />
| relay_private_channel_in<br />
| all traffic from the IRC channel will be send on this private<br />
channel in-world<br />
|-<br />
| relay_private_channel_out<br />
| all chat on this private in-world channel is relayed to the IRC<br />
channel <br />
|-<br />
| access_password<br />
| set this to a password of your choice<br />
|-<br />
|}<br />
<br />
Your in-world objects then need to use LSL code along the following lines:<br />
<br />
<pre><br />
llSay(command_channel, “access_password,from,message”);<br />
</pre><br />
<br />
to send messages to the IRC channel.<br />
<br />
<br />
== In-World configuration ==<br />
<br />
The last feature worth mentioning is that you can control <code>IRCBridge</code> from in-world by sending commands on a specific command channel. <br />
<br />
To enable this feature you need to use the following configuration instructions:<br />
<br />
<pre><br />
commands_enabled = true<br />
command_channel = 4711<br />
</pre><br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| commands_enabled<br />
| needs to be “true”<br />
|-<br />
| command_channel<br />
| set this to the private in-world channel number that you want to use<br />
|}<br />
<br />
<code>IRCBridge</code> understands the following commands:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| server hostname<br />
| change to the new IRC server “hostname”<br />
|-<br />
| port port-number<br />
| change the port used to connect to the IRC server<br />
|-<br />
| channel channel-name<br />
| change the channel name used<br />
|-<br />
| nick new-nick<br />
| change the nick name used<br />
|-<br />
| client-reporting true|false<br />
| enable client reporting<br />
|- <br />
| in-channel channel-number<br />
| change relay_private_channel_in to channel-number<br />
|-<br />
| out-channel channel-number<br />
| change relay_private_channel_out to channel-number<br />
|-<br />
| close<br />
| close the IRC connection<br />
|-<br />
| connect<br />
| open the IRC connection<br />
|-<br />
| reconnect<br />
| close and re-open the IRC connection<br />
|}<br />
<br />
== irc_admin XmlRpc method ==<br />
<br />
<code>IRCBridge</code> supports one XmlRpc method that allows you to obtain the <code>IRCBridge</code>configuration for a specific region. To enable this method you need to enable the <code>[RemoteAdmin]</code> module.<br />
<br />
<code>irc_admin</code> expects two parameters:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| password<br />
| the RemoteAdmin password<br />
|-<br />
| region<br />
| the region name for which you want to the IRC configuration<br />
|-<br />
|}<br />
<br />
it will return <br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! parameter<br />
! explanation<br />
|-<br />
| server<br />
| the server name<br />
|-<br />
| port<br />
| the port name<br />
|-<br />
| user<br />
| the IRC user name being used<br />
|-<br />
| channel<br />
| the channel name being used<br />
|-<br />
| enabled<br />
| whether the IRC relay is enabled or not<br />
|-<br />
| connected<br />
| whether the IRC relay is connected or not<br />
|-<br />
| nickname<br />
| the current nickname<br />
|}</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T14:56:46Z<p>DrScofield: added object chat relay section</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
=== Traditional IRCBridge mode ===<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
=== Multi-channel mode ===<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align=”center” <br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align=”center” <br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.<br />
<br />
=== Object chat relay mode ===<br />
<br />
In object chat relay mode <code>IRCBridge</code> relays messages from<br />
and to in-world channels.<br />
<br />
To configure <code>IRCBridge</code> for this mode you need to use the<br />
following configuration:<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = false<br />
report_clients = false<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
<br />
relay_private_channels = true<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
The important configuration variables here are:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| relay_chat <br />
| needs to be disabled (well, you can keep it enabled if your in-world<br />
objects are silent and do not repeat what they heard)<br />
|-<br />
| report_clients<br />
| doesn’t really make sense if you’ve disabled relay_chat<br />
|-<br />
| relay_private_channels<br />
| needs to be set to “true”<br />
|-<br />
| relay_private_channel_in<br />
| all traffic from the IRC channel will be send on this private<br />
channel in-world<br />
|-<br />
| relay_private_channel_out<br />
| all chat on this private in-world channel is relayed to the IRC<br />
channel <br />
|}</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T14:24:07Z<p>DrScofield: /* Multi-channel mode */</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
=== Traditional IRCBridge mode ===<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
=== Multi-channel mode ===<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" <br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width="40%" | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T13:37:12Z<p>DrScofield: </p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
=== Traditional IRCBridge mode ===<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| align=”center” border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
=== Multi-channel mode ===<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| width=”30%” | channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T13:33:37Z<p>DrScofield: completed multi-channel section</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
=== Traditional IRCBridge mode ===<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
=== Multi-channel mode ===<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}<br />
<br />
Finally, a more comprehensive example of a configuration file; we are<br />
assuming that we have two regions, ''Wonky'' and ''Borked'': <br />
<br />
<pre><br />
channel = “[%region]”<br />
server = “[%region]-server”<br />
port = “[%region]-port”<br />
nick = “[%region]-nick”<br />
<br />
Wonky-server = irc1.server.org<br />
Wonky-port = 1234<br />
Wonky-nick = WonkyBot<br />
<br />
Borked-server = irc2.anotherserver.net<br />
Borked-port = 1234<br />
Borked-nick = BorkedBot<br />
<br />
</pre><br />
<br />
The ''Wonky'' region will connect to IRC channel <code>#Wonky</code> <br />
via port 1234 of IRC server <code>irc1.server.org</code> and <code>IRCBridge</code><br />
will appear as ''WonkyBot''. Our ''Borked'' region will connect to IRC channel<br />
<code>#Borked</code> via port 1234 of IRC server<br />
<code>irc2.anotherserver.net</code> using the nickname ''BorkedBot''.</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T11:43:46Z<p>DrScofield: </p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
=== Traditional IRCBridge mode ===<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
=== Multi-channel mode ===<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0"<br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T11:42:04Z<p>DrScofield: adding run-time variables</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
=== Traditional IRCBridge mode ===<br />
<br />
In the traditional <code>IRCBridge</code> mode ("traditional" because<br />
that was the original <code>IRCBridge</code> ''modus operandi'') all<br />
in-world avatar chat from all regions is relayed to a specific IRC<br />
chat channel on a specific server. Chat from an avatar is reported by<br />
an OpenSim powered ''IRC bot'' in the IRC channel. Chat originating on the<br />
IRC channel is reported via "voice of god" in all regions (voice of<br />
god meaning that the in-world avatars will "hear" the chat but won't<br />
be able to see the originator anywhere in the region). <br />
<br />
To configure <code>IRCBridge</code> for traditional mode operation use<br />
the following configuration section in your <code>OpenSim.ini</code><br />
file (modifying as necessary, of course): <br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
Let’s go through the list of configuration options:<br />
<br />
{| class="wikitable" style="background:transparent" border=”1”<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
=== Multi-channel mode ===<br />
<br />
With multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
The following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from ''region A'' into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
Let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).<br />
<br />
{| class="wikitable" style="background:transparent" border=”1”<br />
|-<br />
! align=”left” | configuration<br />
! align=”left” | explanation<br />
|-<br />
| channel = “#OS”<br />
| will connect all regions to the same channel; multiple opensim<br />
servers, specifying this same name would share the channel<br />
|-<br />
| channel = “#OS[%host]”<br />
| will connect all regions of a particular opensim server to the named<br />
channel; multiple hosts specifying this same pattern would each be<br />
connected to an unique host-name derived channel<br />
|-<br />
| channel = “#OS[%region]”<br />
| will result in each region being connected to a channel derived from<br />
the region's name; in effect, all regions will be connected to a<br />
unique channel; If two opensim servers were running an identically<br />
named region, then those regions would share the channel<br />
|- <br />
| channel = “#OS[%host]-[%region]”<br />
| will result in each server-region combination being connected to an<br />
unique channel; this offers the best guarantee of unique name across<br />
the internet as a whole <br />
|-<br />
| channel = “#OS[%region][%k]”<br />
| this configuration distinguishes consecutive activations of the same<br />
region by affixing an unique numeric to the end of the name<br />
|-<br />
|}<br />
<br />
In all of these examples, the square brackets are eliminated by the<br />
substitution process. The '%' prefix indicates that this is a run-time<br />
variable. A value in square-brackets and not preceded by '%' indicates<br />
that the value may have been supplied as a value in the IRC ini<br />
configuration. For example, the existing mechanism for naming the<br />
channel could be made unnecessary complicated by specifying: <br />
<br />
<pre><br />
channel = “[channelid]”<br />
channelid = “#my-irc-channel”<br />
</pre><br />
<br />
The substitution process is exhaustive, so a configuration variable<br />
name may be constructed from run-time values. <br />
<br />
To illustrate this, assume that the .ini file contains:<br />
<br />
<pre><br />
channel = “#[%region]”<br />
#brief1 = “#chatter-1”<br />
#brief2 = “#chatter-2”<br />
</pre><br />
<br />
Then region ''brief1'' will be connected to channel ''#chatter-1'', ''brief2''<br />
will be connected to ''#chatter-2'', and all other regions will connect to<br />
channels with names identical to their region names. This is a trivial<br />
example, but becomes more meaningful when we consider all of the other<br />
parameters that might need to be unique per region (server, port<br />
etc). Using this mechanism we can create an ini file that has unique<br />
settings for all aspects of IRC for each region. <br />
<br />
The following run-time values are available to this process:<br />
<br />
{| class="wikitable" style="background:transparent" border=”1”<br />
|-<br />
! variable<br />
! explanation<br />
|-<br />
| %host<br />
| external host name associated with a region<br />
|-<br />
| %region<br />
| region name<br />
|-<br />
| %locX<br />
| X coordinate of the region.<br />
|-<br />
| %locY<br />
| Y coordinate of the region.<br />
|-<br />
| %master1<br />
| Master Avatar's first name<br />
|-<br />
| %master2<br />
| Master Avatar's last name<br />
|-<br />
| %k<br />
| A unique numeric assigned to this region, e.g. “0”<br />
|}</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T09:28:52Z<p>DrScofield: changing to table, starting multi-channel mode description</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
=== Traditional IRCBridge mode ===<br />
<br />
in the traditional <code>IRCBridge</code> mode ("traditional" because that was the original <code>IRCBridge</code> ''modus operandi'') all in-world avatar chat from all regions is relayed to a specific IRC chat channel on a specific server. chat from an avatar is reported by an OpenSim powered ''IRC bot'' in the IRC channel. chat originating on the IRC channel is reported via "voice of god" in all regions (voice of god meaning that the in-world avatars will "hear" the chat but won't be able to see the originator anywhere in the region).<br />
<br />
to configure <code>IRCBridge</code> for traditional mode operation use the following configuration section in your <code>OpenSim.ini</code> file (modifying as necessary, of course):<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
let’s go through the list of configuration options:<br />
<br />
{| class=”wikitable”<br />
|-<br />
! configuration variable<br />
! explanation<br />
|-<br />
| enabled <br />
| you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
|-<br />
| server<br />
| the hostname of the IRC server that you intend to use<br />
|-<br />
| nick<br />
| the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
|-<br />
| channel<br />
| the IRC channel to connect to<br />
|-<br />
| port<br />
| the port on the IRC server to conect to; this is usually port 6667<br />
|-<br />
| relay_chat<br />
| for traditional mode you need to set this to “true” to relay normal in-world chat <br />
|-<br />
| report_clients<br />
| if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
|-<br />
| msgformat<br />
| select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
|-<br />
| commands_enabled<br />
| leave as is for traditional mode<br />
|-<br />
| command_channel<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channels<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_in<br />
| leave as is for traditional mode<br />
|-<br />
| relay_private_channel_out<br />
| leave as is for traditional mode<br />
|-<br />
| access_password<br />
| leave as is for traditional mode<br />
|-<br />
|}<br />
<br />
<br />
=== Multi-channel mode ===<br />
<br />
with multi-channel mode we can configure <code>IRCBridge</code> to<br />
relay chat from different regions into '''different IRC channels''' — or<br />
even into '''different IRC channels on different IRC servers'''!<br />
<br />
the following <code>OpenSim.ini</code> configuration file extract<br />
configures <code>IRCBridge</code> to relay chat from region A into<br />
IRC channel <code>#opensin-A-opensim.server.net</code><br />
<br />
<pre><br />
channel = "#opensin-[%region]-[%host]"<br />
</pre><br />
<br />
let’s take a closer look at what’s going on here:<br />
<code>IRCBridge</code> allows us to apply run-time variable<br />
substitution (a quite powerful mechanism).</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T08:47:01Z<p>DrScofield: adding explanation for traditional mode</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
in the traditional <code>IRCBridge</code> mode ("traditional" because that was the original <code>IRCBridge</code> ''modus operandi'') all in-world avatar chat from all regions is relayed to a specific IRC chat channel on a specific server. chat from an avatar is reported by an OpenSim powered ''IRC bot'' in the IRC channel. chat originating on the IRC channel is reported via "voice of god" in all regions (voice of god meaning that the in-world avatars will "hear" the chat but won't be able to see the originator anywhere in the region).<br />
<br />
to configure <code>IRCBridge</code> for traditional mode operation use the following configuration section in your <code>OpenSim.ini</code> file (modifying as necessary, of course):<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
report_clients = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre><br />
<br />
let’s go through the list of configuration options:<br />
<br />
; enabled <br />
: you need to set this to “true” otherwise <code>IRCBridgeModule</code> will not be enabled<br />
<br />
; server<br />
: the hostname of the IRC server that you intend to use<br />
<br />
; nick<br />
: the nickname which <code>IRCBridge</code> will use to connect to the IRC server <br />
<br />
; channel<br />
: the IRC channel to connect to<br />
<br />
; port<br />
: the port on the IRC server to conect to; this is usually port 6667<br />
<br />
; relay_chat<br />
: for traditional mode you need to set this to “true” to relay normal in-world chat <br />
<br />
; report_clients<br />
: if you set this to “true” then <code>IRCBridge</code> will notify the IRC channel whenever an avatar logs on, enters a region, leaves a region, and logs off<br />
<br />
; msgformat<br />
: select whichever message format you want <code>IRCBridge</code> to use for relaying in-world messages to the IRC channel.<br />
<br />
; commands_enabled<br />
; command_channel<br />
; relay_private_channels<br />
; relay_private_channel_in<br />
; relay_private_channel_out<br />
; access_password<br />
: leave as shown in the example for traditional mode</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-04T06:40:16Z<p>DrScofield: adding config for traditional mode</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in three modes: <br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
* in ''object chat relay mode'' where we only relay chat to and from private in-world channels<br />
<br />
== Traditional IRCBridge mode ==<br />
<br />
in the traditional <code>IRCBridge</code> mode ("traditional" because that was the original <code>IRCBridge</code> ''modus operandi'') all in-world avatar chat from all regions is relayed to a specific IRC chat channel on a specific server. chat from an avatar is reported by an OpenSim powered ''IRC bot'' in the IRC channel. chat originating on the IRC channel is reported via "voice of god" in all regions (voice of god meaning that the in-world avatars will "hear" the chat but won't be able to see the originator anywhere in the region).<br />
<br />
to configure <code>IRCBridge</code> for traditional mode operation use the following configuration section in your <code>OpenSim.ini</code> file (modifying as necessary, of course):<br />
<br />
<pre><br />
[IRC]<br />
enabled = true ; you need to set this otherwise it won't connect<br />
server = some.irc.server.net<br />
nick = OpenSinBot<br />
channel = #opensin<br />
port = 6667<br />
relay_chat = true<br />
<br />
commands_enabled = false<br />
command_channel = 4711<br />
report_clients = true<br />
relay_private_channels = false<br />
relay_private_channel_out = 4712<br />
relay_private_channel_in = 4713<br />
<br />
access_password = WuffWuff<br />
<br />
;fallback_region = name of "default" region<br />
;MSGformat fields : 0=botnick, 1=user, 2=region, 3=message<br />
; must start with "PRIVMSG {0} : " or irc server will get upset<br />
;for <bot>:<user in region> :<message><br />
msgformat = "PRIVMSG {0} :<{1} in {2}>: {3}"<br />
;for <bot>:<message> - <user of region> :<br />
;msgformat = "PRIVMSG {0} : {1} [{2}]: {3}"<br />
;for <bot>:<message> - from <user> :<br />
;msgformat = "PRIVMSG {0} : {3} - from {1}"<br />
<br />
</pre></div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-03T17:56:01Z<p>DrScofield: adding modes section</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...<br />
<br />
<code>IRCBridge</code> can be used in two modes: either<br />
<br />
* in ''traditional mode'' where we relay all in-world chat from all regions to a single IRC channel on a single server, or<br />
* in ''multi-channel mode'' where we can relay in-world chat from a specific region to a specific channel (or even to a specific server)<br />
<br />
== Traditional IRCBridge mode ==</div>DrScofieldhttp://opensimulator.org/wiki/IRCBridgeModuleIRCBridgeModule2008-11-03T17:38:00Z<p>DrScofield: starting IRCBridgeModule configuration page.</p>
<hr />
<div>== Configuring IRCBridgeModule ==<br />
<br />
<code>IRCBridgeModule</code> allows you to relay chat from your OpenSim region to an IRC channel and vice versa. You can use this module to <br />
<br />
* make in-world chat available via a text-only interface such as IRC<br />
* control objects from IRC channels<br />
* use in-world objects to control bots attached via IRC<br />
* ...</div>DrScofieldhttp://opensimulator.org/wiki/GridInfoGridInfo2008-07-28T12:05:57Z<p>DrScofield: example invocation of /get_grid_info</p>
<hr />
<div>The '''GridInfo protocol''' was suggested by [http://mjm.game-host.org/opensim:viewer:contents mana janus] to facilitate autoconfiguration of clients. With the GridInfo protocol a smart client only needs to have the URI of the user server or the standalone server and can then obtain parameters such as the welcome page, the helper URI (for the economy subsystem), the name of the grid and other information automatically.<br />
<br />
Retrieving the GridInfo is just a simple HTTP GET call to /get_grid_info on either the standalone server's URL or on the grid's user server:<br />
<br />
<pre><br />
% GET http://127.0.0.1:9000/get_grid_info | xml_pp<br />
<gridinfo><br />
<login>http://127.0.0.1:9000/</login><br />
<gridname>the lost continent of hippo</gridname><br />
<mode>standalone</mode><br />
<register>http://127.0.0.1/register</register><br />
<platform>OpenSim</platform><br />
<help>http://127.0.0.1/help</help><br />
<about>http://127.0.0.1/about/</about><br />
<welcome>http://127.0.0.1/welcome</welcome><br />
<gridnick>hippogrid</gridnick><br />
<password>http://127.0.0.1/password</password><br />
<economy>http://127.0.0.1:9000/</economy><br />
</gridinfo><br />
</pre><br />
<br />
which was "generated" by the following [GridInfo] section:<br />
<pre><br />
[GridInfo]<br />
; login uri<br />
login = http://127.0.0.1:9000/<br />
; login page<br />
welcome = http://127.0.0.1/welcome<br />
; helper uri<br />
economy = http://127.0.0.1:9000/<br />
; web page of grid<br />
about = http://127.0.0.1/about/<br />
; account creation<br />
register = http://127.0.0.1/register<br />
; help<br />
help = http://127.0.0.1/help<br />
; password help<br />
password = http://127.0.0.1/password<br />
; long grid name<br />
gridname = "the lost continent of hippo"<br />
; short grid name<br />
gridnick = "hippogrid"<br />
</pre><br />
</pre><br />
<br />
Have a look at the option table in the [[OpenSim.ini]] section for all GridInfo options --- note, that you can add additional keys there, they are automatically included in the response.</div>DrScofieldhttp://opensimulator.org/wiki/GridInfoGridInfo2008-07-25T18:18:31Z<p>DrScofield: New page: The '''GridInfo protocol''' was suggested by [http://mjm.game-host.org/opensim:viewer:contents mana janus] to facilitate autoconfiguration of clients. With the GridInfo protocol a smart cl...</p>
<hr />
<div>The '''GridInfo protocol''' was suggested by [http://mjm.game-host.org/opensim:viewer:contents mana janus] to facilitate autoconfiguration of clients. With the GridInfo protocol a smart client only needs to have the URI of the user server or the standalone server and can then obtain parameters such as the welcome page, the helper URI (for the economy subsystem), the name of the grid and other information automatically.<br />
<br />
Have a look at the option table in the [[OpenSim.ini]] section for all GridInfo options.</div>DrScofieldhttp://opensimulator.org/wiki/User_DocumentationUser Documentation2008-07-25T17:52:08Z<p>DrScofield: grid info</p>
<hr />
<div>{{Template:Quicklinks}}<br />
__NOTOC__<br />
==Initial Setup==<br />
* [[Download]] - Download instructions<br />
* [[OpenSim Build Instructions|Build Instructions]] - How to build and compile OpenSim from Source<br />
* [[OpenSim Configuration|Configuration]] - How to get your OpenSim server up and running<br />
* [[Connecting]] - How to connect a compatible viewer to OpenSim<br />
* [[Troubleshooting]] - How to trouble shoot your OpenSim installation.<br />
* [[Tips]] - Useful tips from users like you<br />
* [[FAQ]] - Frequently Asked Questions<br />
<br />
==Administrator Guide==<br />
* [[Server Commands]] - Commands to control OpenSim<br />
* [[OpenSim Database support]] - Dealing with databases<br />
* [[Custom Libraries]] - Describes how to add custom content to your OpenSim server<br />
* [[Automating Tasks]] - How to make administrating a walk in the park<br />
* [[Network Settings]] - NAT, Ports, Services and more...<br />
* [[Management]] - All about being an effective administrator/moderator<br />
* [[Performance]] - How to tweak OpenSim's performance<br />
* [[Console-less OpenSim]] - How to run OpenSim without console<br />
* [[GridInfo]] - how to provide information about your grid to smart clients<br />
<br />
==Facilities==<br />
* [[OpenSim Archives]] - Loading and saving whole region archives with OpenSim<br />
<br />
==Scripting==<br />
* [[Scripting Documentation]] - Everything you need to know about OpenSim scripting<br />
* [[Scripting Library]] - A list of example scripts<br />
<br />
==Tutorials==<br />
* [[OSGrid Region Registration]] - Describes how to link your region into OS-Grid<br />
* [[Hints & Tricks]] - A page for Hints and Tricks<br />
* [[Using L3DT]] - How to create custom terrains<br />
* [[Linux Gridserver]] using 'moo' - How to setup a Gridserver on a Linux machine using 'moo'<br />
<br />
==Contribution Policy==<br />
* [[User_Wiki_Conventions|User Wiki Conventions]] - Read this carefully, before adding content to the wiki<br />
[[Category:Users]]<br />
<cleanpage title=hide cats=hide /></div>DrScofieldhttp://opensimulator.org/wiki/Setting_things_up_on_LinuxSetting things up on Linux2008-07-06T15:36:30Z<p>DrScofield: expanding a bit on the required steps</p>
<hr />
<div>== 1. Get and build the code==<br />
<br />
Much instruction on this is in the [[User Documentation|User Docs]], basically it boils down to:<br />
<br />
* installing a recent version of mono<br />
* [[Download#Source_code|downloding the source code]] either as a tar.gz file, or by checking out the source code from the OpenSim subversion (SVN) repository, or by clone the OpenSim mercurial repository<br />
<br />
==2. Start programming==<br />
<br />
Ha ha, only joking (but seriously, you could just go and edit the code with vi or emacs or something, it's all in the OpenSim directory). However, we find that most people tend to like to use an IDE when writing OpenSim code. The best one on Linux is probably [http://www.monodevelop.com/Main_Page Monodevelop]. You should be able to load the OpenSim.sln file sitting in the root OpenSim directory into this (this file was generated at the prebuild.sh step, as described in the user instructions). See [[Monodevelop|this wiki page]] for more details.</div>DrScofieldhttp://opensimulator.org/wiki/DownloadDownload2008-07-06T15:32:19Z<p>DrScofield: added instructions for the mercurial repository</p>
<hr />
<div>{{Template:Quicklinks}}<br />
==Source code==<br />
Here are the current released versions of OpenSim. <br />
<br />
<font color=red>'''Please note:'''</font> As OpenSim is still at an alpha code maturity stage, there is absolutely no guarantee that functionality works or is stable, even in the numbered releases. Certain features may not work either because the code is in rapid evolution, or because functionality expected by the Linden Labs Second Life viewer has simply not been implemented yet. However, constructive feedback is still welcomed.<br />
<br />
Also, please be aware that OpenSim requires that you have a fair amount of technical knowledge in order to set it up - there is no point and click installer (and having one would probably be premature at this stage).<br />
<br />
You may need to use the Subversion source code management system to obtain the code. Subversion can be downloaded for Windows from [http://subversion.tigris.org/servlets/NewsItemView?newsItemID=1941 here], or for Mac OS X 10.4.x [http://homepage.mac.com/martinott/Subversion-1.4.4.pkg.zip here]. SVN is built into Mac OS X 10.5.<br />
<br />
Another option for obtaining the code is via [http://www.selenic.com/mercurial/wiki/ mercurial] from the [http://opensimulator.org/hg/opensim-trunk/ OpenSim repository].<br />
<br />
* '''Latest Subversion revision version (bleeding edge)'''<br />
svn co http://opensimulator.org/svn/opensim/trunk opensim<br />
<br />
* '''Latest mercurial revision version (bleeding edge)'''<br />
hg clone http://opensimulator.org/hg/opensim-trunk/ opensim<br />
<br />
* '''0.5.8 is the latest release source tarball in .tgz format (a few steps back from the bleeding edge) (6/14/08)'''<br />
http://dist.opensimulator.org/opensim-0.5.8.tgz<br />
<br />
for those who prefer git, there is an "unofficial mirror" of SVN into git. It is intended for the collaborative prototyping/proofs of concept, etc.<br />
git clone http://opensim.be/git/opensim-svn.git<br />
If you know SVN and are interested to compare git, refer to the [http://git.or.cz/course/svn.html crash course]<br />
<br />
==Binaries==<br />
<font color=red>'''Please Note:'''</font> These binaries are unofficial - they are not endorsed by the core OpenSimulator development team and so we cannot guarantee their authenticity. If you use them, please don't necessarily expect support from the community, especially if they are older versions than the current version. At this stage in our development, it is often be the case that many issues have been fixed since they were released. Currently, the prefered method to get a working system is to build OpenSimulator from source.<br />
<br />
===Official Builds===<br />
<br />
These builds are the official binary releases by the OpenSim developement team<br />
prepared and hosted by (shameless plug) [http://osgrid.org OSGrid.org]<br />
<table><br />
<tr><br />
<td>download</td><br />
<td>compression</td><br />
<td>&nbsp;</td><br />
<tr><br />
<td>[http://osgrid.org/download/opensim-bin-0.5.8.tar.bz2 OpenSim 0.5.8]</td><br />
<td>BZIP2</td><br />
<td>2008-Jul-01</td><br />
</tr><br />
<tr><br />
<td>[http://osgrid.org/download/opensim-bin-0.5.8.zip Opensim 0.5.8]</td><br />
<td>ZIP</td><br />
<td>2008-Jul-01</td><br />
</tr><br />
</table><br />
<br />
===Un-Official Trunk Builds===<br />
* [http://builds.opensimulator.org OpenSim Trunk - builds.opensimulator.org]<br />
* [http://www.twingate.nl/downloads/opensim/trunk-build/22may2008/opensim-trunk(22may2008).7z OpenSim Trunk - www.twingate.nl]<br />
<br />
<br />
===Un-Official Nightly Builds===<br />
* [http://opensim.be/build/ Opensim nightly build - opensim.be]<br />
<br />
==Addons==<br />
Openlibrary release v0.20 is a collection of Texures, Skins, Clothing etc Assets & Inventory Items common to all users when installed to your OpenSimulator Release. This library is provided under Creative Commons 2.5 by Attribution License.<br />
* [http://www.sendspace.com/file/ebqan8 Mirror (login not required to download)]<br />
To Use Delete your existing Assets & Inventory Library and Replace with the Assets & Inventory Folders contained in the .zip file.<br />
<br />
''Pages by Category:''[[:Category:Users| User-pages]],[[:Category:Development| Developer-pages]],[[:Category:Scripts| Scripts]]<br /><br />
<br />
[[Category:Users]]<br />
[[Category:Developers]]<br />
<cleanpage title=hide cats=hide /></div>DrScofieldhttp://opensimulator.org/wiki/User:DrScofieldUser:DrScofield2008-05-16T11:53:11Z<p>DrScofield: </p>
<hr />
<div>hi there. i'm dirk husemann and work for IBM research in (sometimes) sunny switzerland. if you are interested, i'm keeping a [http://xyzzyxyzzy.net/ technical blog, xyzzy xyzzy...,] where you'll find [http://xyzzyxyzzy.net/tag/OpenSim a couple of posts about my on-going OpenSim work.]</div>DrScofieldhttp://opensimulator.org/wiki/User:DrScofieldUser:DrScofield2008-05-16T11:52:47Z<p>DrScofield: </p>
<hr />
<div>hi there. i'm dirk husemann and work for IBM research in (sometimes) sunny switzerland. if you are interested, i'm keeping a [http://xyzzyxyzzy.net/ technical blog, xyzzy xyzzy...] where you'll find [http://xyzzyxyzzy.net/tag/OpenSim a couple of posts about my on-going OpenSim work.]</div>DrScofieldhttp://opensimulator.org/wiki/User:DrScofieldUser:DrScofield2008-05-16T11:52:30Z<p>DrScofield: who am i, where else to find me.</p>
<hr />
<div>hi there. i'm dirk husemann and work for IBM research in (sometimes) sunny switzerland. if you are interested, i'm keeping a [http://xyzzyxyzzy.net/ technical blog, xyzzy xyzzy...]] where you'll find [http://xyzzyxyzzy.net/tag/OpenSim a couple of posts about my on-going OpenSim work.]</div>DrScofieldhttp://opensimulator.org/wiki/Development_TeamDevelopment Team2008-05-16T11:47:05Z<p>DrScofield: + drscofield</p>
<hr />
<div>== OpenSim Core Developers ==<br />
These people have commit access to our central SVN server and are regular contributors to the codebase.<br />
<br />
(please add in as much info as you like for your name)<br />
<br />
<table border="1" cellpadding="2" cellspacing="0" class="sortable"><br />
<tr><br />
<th>Photo </th><br />
<th>IRC Nick </th><br />
<th>Name</th><br />
<th>SL Avatar</th><br />
<th>Other Grid</th><br />
<th>Time Zone<br>(UTC)</th><br />
<th>Org</th><br />
<th>Areas of Interest</th><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:MW / Michael Wright |MW / Michael Wright ]]</td><br />
<td>Darren</td><br />
<td>Wright Juran</td><br />
<td></td><br />
<td>0</td><br />
<td>Tribal Media AB</td><br />
<td>everything</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Adam Frisby|Adam Frisby]]</td><br />
<td>Adam Frisby</td><br />
<td>Adam Zaius</td><br />
<td></td><br />
<td>+8</td><br />
<td>DeepThink Pty Ltd</td><br />
<td>Terrain, Performance</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:MingChen|MingChen]]</td><br />
<td>Mike/Michael Ortman</td><br />
<td>Ming Chen</td><br />
<td></td><br />
<td>-6 (-5 in Summer)</td><br />
<td>DeepThink Pty Ltd</td><br />
<td>Estate/Parcel Support/Modules/Keeping things all neat and tidy.</td><br />
</tr><br />
<tr><br />
<td> </td><br />
<td>[[User:lbsa71|lbsa71]]</td><br />
<td>Stefan Andersson</td><br />
<td>PierreJoseph Proudhon</td><br />
<td>OSG:Stefan Andersson<br/>OLG:Stefan Andersson</td><br />
<td>+1</td><br />
<td>Tribal Media AB</td><br />
<td> 3D and Web Integration</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:SeanDague|sdague]]</td><br />
<td>Sean Dague</td><br />
<td>Neas Bade</td><br />
<td></td><br />
<td>-5</td><br />
<td>IBM</td><br />
<td>Database, Linux, Testing, Misc</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:babblefrog|babblefrog]]</td><br />
<td>Brian McBee</td><br />
<td>Dogen Coldstream</td><br />
<td>Babblefrog Ballistic (osgrid)</td><br />
<td>-8</td><br />
<td>Disorganized</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Tedd|Tedd]]</td><br />
<td>Tedd Hansen</td><br />
<td>Tedd Maa</td><br />
<td></td><br />
<td>+1</td><br />
<td>Tedd Hansen</td><br />
<td>Programming/Scripting/Architecture</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:danx0r|danx0r]]</td><br />
<td>Dan Miller</td><br />
<td>Albert Pascal</td><br />
<td></td><br />
<td>-8</td><br />
<td>squiggle.com</td><br />
<td>PHEEZIKS; everything</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:dalien|dalien]]</td><br />
<td>Dalien Talbot</td><br />
<td>Dalien Talbot</td><br />
<td></td><br />
<td>+1</td><br />
<td>Mostly TCP-based</td><br />
<td>Small fixes; rev.eng./prototyping; nightlies; git-keeper </td><br />
</tr><br />
<tr><br />
<td /><br />
<td>Tleiades</td><br />
<td>&nbsp;</td><br />
<td>Tleiades&nbsp;Hax</td><br />
<td></td><br />
<td>+1</td><br />
<td>&nbsp;</td><br />
<td>Grid servers/Database</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>ckrinke</td><br />
<td>Charles&nbsp;Krinke</td><br />
<td>Charlesk&nbsp;Bing</td><br />
<td></td><br />
<td>-8</td><br />
<td>&nbsp;</td><br />
<td>Reliability/Grid servers/ll-functions</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:chi11ken|chi11ken]]</td><br />
<td>Jeff Ames</td><br />
<td>Chillken Proto</td><br />
<td></td><br />
<td>+9</td><br />
<td>3Di<br>http://www.3di.jp/</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Darok|Darok]]</td><br />
<td>&nbsp;</td><br />
<td>Darok Kaminski</td><br />
<td></td><br />
<td>+1</td><br />
<td>&nbsp;</td><br />
<td>Physics engines (especially BulletX)</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:adjohn|adjohn]]</td><br />
<td>Adam Johnson</td><br />
<td>Zeuz Zenovka</td><br />
<td></td><br />
<td>+9</td><br />
<td>3Di<br>http://www.3di.jp/</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:joha1|joha1]]</td><br />
<td>Johan Berntsson</td><br />
<td>Joppi Brandenburg</td><br />
<td></td><br />
<td>+9</td><br />
<td>3Di<br>http://www.3di.jp/</td><br />
<td>Performance, packet handling/libSL</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Teravus|Teravus]]</td><br />
<td>Teravus</td><br />
<td>Teravus Ousley</td><br />
<td></td><br />
<td>-5</td><br />
<td>W3z</td><br />
<td>Physics & Admin tools, A working sim.</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:Justincc|Justincc]]</td><br />
<td>Justin Clark-Casey</td><br />
<td>Lulworth Beaumont</td><br />
<td>Justin Clark-Casey (osgrid)</td><br />
<td>0</td><br />
<td>IBM</td><br />
<td>Grid, performance & reliability, inventory (avatar and object), assets, scenes.</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[Alondria]]</td><br />
<td></td><br />
<td>Alondria LeFay</td><br />
<td>Alondria LeFay (OSGrid)</td><br />
<td>-8</td><br />
<td>Independent</td><br />
<td>Implementation of LSL functions and other scripting tidbits.</td><br />
</tr><br />
<tr><br />
<td /><br />
<td>[[User:DrScofield|drscofld]]</td><br />
<td>Dirk Husemann</td><br />
<td>Dr Scofield</td><br />
<td></td><br />
<td>+1</td><br />
<td>IBM</td><br />
<td>reliability, networking protocols, voice, inventory, assets, remote control, and pretty much everything else :-)</td><br />
</tr><br />
</table><br />
<br />
== Additional Developers/Testers/Contributors ==<br />
These people have contributed bug reports, patches or other contributions to OpenSim.<br />
<br />
<table border="1" cellpadding="2" cellspacing="0" class="wikitable sortable"><br />
<tr><br />
<th>IRC Nick </th><br />
<th>Name</th><br />
<th>SL Avatar</th><br />
<th>Other Grid</th><br />
<th>Time Zone<br>(UTC)</th><br />
<th>Org</th><br />
<th>Areas of Interest</th><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Nebadon|Nebadon]]</td><br />
<td>Michael Cerquoni</td><br />
<td>Nebadon Izumi</td><br />
<td>Nebadon Izumi</td><br />
<td>-7 Arizona</td><br />
<td>Oni Kenkon Creations</td><br />
<td>Building, Scripting, Testing</td><br />
</tr><br />
<tr><br />
<td>[[User:jtclark48|jclark4]]</td><br />
<td>Jay Clark</td><br />
<td>Jay Clarke</td><br />
<td></td><br />
<td>-5</td><br />
<td>IBM</td><br />
<td>Physics, Grid Host, AI, Scripting, Testing</td><br />
</tr><br />
<tr><br />
<td>Gareth</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td></td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td>[[User:AdamStevenson|BigFootAg]]</td><br />
<td>Adam Stevenson</td><br />
<td>Adamus Petrov</td><br />
<td></td><br />
<td>-6</td><br />
<td>Texas A&M University</td><br />
<td>AI, Skynet, Evolving Systems, Biology</td><br />
</tr><br />
<tr><br />
<td>[[User:Vicero Lambert|Vicero Lambert]]</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td></td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td>Ldvoipeng</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td></td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td>idoru</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td></td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td>simsim</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td></td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
</tr><br />
<tr><br />
<td>[[User:Magi|Magi]]</td><br />
<td>Andy Agnew</td><br />
<td>Magi Merlin</td><br />
<td></td><br />
<td>+10</td><br />
<td>Spun Pty Ltd</td><br />
<td>3D Web Integration, Database stuff and playing with the odds and ends box.</td><br />
</tr><br />
<tr><br />
<td>john_</td><br />
<td>John&nbsp;Moyer</td><br />
<td>VAJohn&nbsp;GeekSquad or&nbsp;Matthew&nbsp;Kendal</td><br />
<td></td><br />
<td>-5</td><br />
<td>Best&nbsp;Buy/Geek&nbsp;Squad</td><br />
<td>Tester</td><br />
</tr><br />
<tr><br />
<td>[[User:ClarkZone|ClarkZone]]</td><br />
<td>Troy Admin(@ClarkZone)</td><br />
<td>Troy Childs</td><br />
<td>Troy Admin (ClarkZone)</td><br />
<td>-5</td><br />
<td>Http://clarkzone.dyndns.org</td><br />
<td>Tester and Grid Host</td><br />
</tr><br />
<tr><br />
<td>[[User:aiaustin|aiaustin]]</td><br />
<td>Ai Austin</td><br />
<td>Ai&nbsp;Austin</td><br />
<td>Ai&nbsp;AIAI&nbsp;(AIAI Grid)</td><br />
<td>+0</td><br />
<td>AIAI,&nbsp;University&nbsp;of&nbsp;Edinburgh<br>http://www.aiai.ed.ac.uk/~ai/<br>http://vue.ed.ac.uk/openvue/</td><br />
<td>Windows Vista tests<br>Content testing<br>Use of multiple VWs</td><br />
</tr><br />
<tr><br />
<td>[[User:balthazar|balthazar]]</td><br />
<td>Trevor Brooks</td><br />
<td>Balthazar Sin</td><br />
<td></td><br />
<td>-5</td><br />
<td>None</td><br />
<td>Terrains, testing and some small coding tasks</td><br />
</tr><br />
<tr><br />
<td>[[User:jimbo2120|jimbo2120]]</td><br />
<td>Michael Osias</td><br />
<td>Illuminous Beltran</td><br />
<td></td><br />
<td>-5</td><br />
<td>IBM</td><br />
<td>Grid, AI, Skynet, coding and testing</td><br />
</tr><br />
<tr><br />
<td>[[User:Sakai|Sakai]]</td><br />
<td>Steve S</td><br />
<td></td><br />
<td>Sakai Openlife (OpenlifeGrid)</td><br />
<td>+10</td><br />
<td>http://www.openlifegrid.com</td><br />
<td>Grid, Hardware, Testing, Contribution</td><br />
</tr><br />
<tr><br />
<td>ZeroPoint</td><br />
<td>&nbsp;</td><br />
<td>Guilderoy&nbsp;Dench</td><br />
<td></td><br />
<td>-5</td><br />
<td>&nbsp;</td><br />
<td>Programming/Database</td><br />
</tr><br />
<tr><br />
<td>MaltosSosa</td><br />
<td>Maltos Sosa</td><br />
<td>Maltos Sosa<br></td><br />
<td>Maltos Sosa (Central Grid)</td><br />
<td>&nbsp;</td><br />
<td>Central Grid</td><br />
<td>Grid Operator, Central Grid Project Manager. Anything we can offer, just ask.</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:DerekTang|DerekTang]]</td><br />
<td>Derek Tang</td><br />
<td>Derek Timeless</td><br />
<td>Derek Tang (ChineseGrid)</td><br />
<td>+8</td><br />
<td>http://ChineseGrid.net</td><br />
<td>Running a public WINDOWS sim for testing, Docs, Helping Chinese users to enjoy OpenSim; building Chinese OpenSim communities. In construction...</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:TayB|TayB]]</td><br />
<td>Earl B</td><br />
<td>Taylor Boyau</td><br />
<td></td><br />
<td>-10</td><br />
<td>ViziGrid</td><br />
<td>Grid Host,Networking,Contributions & Testing.</td><br />
</tr><br />
<tr><br />
<td>[[User:JamieDav|JamieDav]]</td><br />
<td>Jamie David</td><br />
<td>Jamie David</td><br />
<td></td><br />
<td>+7</td><br />
<td>Forum</td><br />
<td>Grid, Sim, Avitar, Functionality</td><br />
</tr><br />
<tr><br />
<td>[[User:Krtaylor|Krtaylor]]</td><br />
<td>Kurt Taylor</td><br />
<td>Kurt Stringer </td><br />
<td></td><br />
<td>-6</td><br />
<td>IBM</td><br />
<td>Grid, Networking, Monitoring, Scripting, Inventory, Testing</td><br />
</tr><br />
<tr><br />
<td>[[User:Nink|Nink]]</td><br />
<td>Peter Finn</td><br />
<td>Nink Noonan</td><br />
<td></td><br />
<td>-5</td><br />
<td>IBM</td><br />
<td>Disruptive Influence.</td><br />
</tr><br />
<tr><br />
<td>[[User:Bruce|Bruce]]</td><br />
<td>Bruce Meerson</td><br />
<td>Bruce Meerson</td><br />
<td></td><br />
<td>+8</td><br />
<td>HiPiHi</td><br />
<td>Watching.</td><br />
</tr><br />
<tr><br />
<tr><br />
<td>[[User:Darb|Darb]]</td><br />
<td>Brian B. Quinn</td><br />
<td>Darb Dabney</td><br />
<td>regions<br />near Berkeley</td><br />
<td>-8</td><br />
<td>City of Berkeley, CA<br /> http://blog.simgis.org</td><br />
<td>Testing large standalones, real-world terrain, <br />pursuit of civic paraverses </td><br />
</tr><br />
<tr><br />
<td>[[CharlieO]]</td><br />
<td>Dan</td><br />
<td>Charlie Omega</td><br />
<td></td><br />
<td>&nbsp;</td><br />
<td>&nbsp;</td><br />
<td>Mild coding/tweaking/simple feature adds, Stress testing/break stuff, Testing limits of existing code. Making sure [[LSL Status]] is up to date</td><br />
</tr><br />
<tr><br />
<td>oobscure</td><br />
<td>&nbsp;</td><br />
<td>Opensource Obscure</td><br />
<td></td><br />
<td>+1</td><br />
<td>http://www.opensim.it</td><br />
<td>Running a public Linux sim for testing, Docs, Helping italian users, Building opensim communities, Watching</td><br />
</tr><br />
<tr><br />
<td>pitman</td><br />
<td>Mike Pitman</td><br />
<td>Rez Tone</td><br />
<td></td><br />
<td>&nbsp;</td><br />
<td>IBM</td><br />
<td>Scientific visualization schemes, virt world product design, persistant workspaces, virt world based big biz</td><br />
</tr><br />
<tr><br />
<td>cmu</td><br />
<td>Christopher Mumme</td><br />
<td>Snook Destiny</td><br />
<td></td><br />
<td>+1</td><br />
<td>http://www.cmu-develop.de/ and research group "Collaboration Systems and CSCW" at Clausthal University of Technology</td><br />
<td>Testing OpenSim, translating the OpenSim Wiki into German and reporting on OpenSim</td><br />
</tr><br />
<br />
<tr><br />
<td>[[Silpol]]</td><br />
<td>Andriy Tymchenko</td><br />
<td>Andy Tir</td><br />
<td></td><br />
<td>EET (+2/3)</td><br />
<td> http://silpol.blogspot.com/ (also visible at Nokia)</td><br />
<td>highly uncoordinated mess with elements of palace games, under-table diplomacy, rebellion, coup d'état and mutiny. optionally pirate</td><br />
</tr><br />
<tr><br />
<td>[[User:Grumly|Grumly]]</td><br />
<td></td><br />
<td>Forest Klaar</td><br />
<td>Grumly TheBear</td><br />
<td>GMT+1</td><br />
<td>.NET MCAD Dev/Arch/Trainer http://www.devoteam.com</td><br />
<td>Trying to get into OpenSim code for now. Particularly interrested in data persistence. blog (Hello, Avatar!): http://lslblog.free.fr</td><br />
</tr><br />
<tr><br />
<td>[[daTwitch]]</td><br />
<td>James G. Stallings II</td><br />
<td><br>Lazarus Longstaff</td><br />
<td>Hiro Protagonist (OSGrid)</td><br />
<td>-5</td><br />
<td>House Husband</td><br />
<td>OSGrid Region owner, OSGrid Operator,<BR>Forum Admin, sometime wiki editor</td><br />
</tr><br />
<br />
<tr><br />
<td>gryc</td><br />
<td>Gryc Ueusp</td><br />
<td>Gryc Uriza</td><br />
<td>Gryc Uriza(OSGrid)</td><br />
<td>-6</td><br />
<td></td><br />
<td>PHP scripting, web interfaces, interconnectivity, cross-platformedness</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Phrearch|Phrearch]]</td><br />
<td>Jeroen van Veen</td><br />
<td>Phrearch Miles</td><br />
<td>Phrearch Miles(OSGrid)</td><br />
<td>Amsterdam/Paris</td><br />
<td></td><br />
<td>Documentation, scripts(perl/lsl), RIA(flex) mashup, testing</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Burnman|Burnman]]</td><br />
<td>Allen Wilkins</td><br />
<td>Burnman Bedlam</td><br />
<td>Sid Green (United Grid)</td><br />
<td>Boston, USA</td><br />
<td>United Grid</td><br />
<td>Testing, testing, and more testing! Getting familiar with the source, interested in all aspects of the project.</td><br />
</tr><br />
<br />
<br />
<tr><br />
<td>[[User:krisbfunk|krisbfunk]]</td><br />
<td>Kris Bulman</td><br />
<td>krisbfunk Vought</td><br />
<td>Krisbfunk Nocturnal(OSGrid)</td><br />
<td>PE, Canada (-4)</td><br />
<td>Edactive Technologies<br />NocturnalEye Productions<br />UPEI</td><br />
<td>Currently: Testing, bug reports, wiki updating, building on OSGrid</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:HashBox|HashBox]]</td><br />
<td>Zane Ashby</td><br />
<td>Sibariel Darkstone</td><br />
<td>Sibariel Darkstone (OSGrid)</td><br />
<td>New Zealand (+12)</td><br />
<td></td><br />
<td>Testing, bug reports, and updating the wiki.</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Kinoc|Kinoc]]</td><br />
<td>Kino Coursey</td><br />
<td>Daxxon Jaxxon</td><br />
<td>Daxxon Kinoc (OSgrid)</td><br />
<td>-6</td><br />
<td>Daxtron Laboratories <br /> http://www.daxtron.com<br /> University of North Texas</td><br />
<td>AI, Semantic web, Ontologies, Natural Laanguage Processing, Cyc, Bots, NPC </td><br />
</tr><br />
<tr><br />
<td>[[User:trapuh|trapuh]]</td><br />
<td>Pedro Ribeiro</td><br />
<td>Vaiten Forder</td><br />
<td></td><br />
<td>GMT</td><br />
<td>University Student, Escola Superior de Educação de Viseu, Portugal </td><br />
<td>Testing, eventual bug reports and wiki. Music, web/digital arts and php+sql.</td><br />
</tr><br />
<tr><br />
<td>[[User:SonicViz|SonicViz]]</td><br />
<td>Paul Cohen</td><br />
<td>Komuso Tokugawa</td><br />
<td></td><br />
<td>+9</td><br />
<td>Http://sonicviz.com</td><br />
<td>Audio/Music, Interactive Music, Control Protocols, Interfaces, VisualFX, Procedural animation/Generative systems + testing and general dev</td><br />
</tr><br />
<tr><br />
<td>[[User:Mokele|mokele]]</td><br />
<td>Scott Norman</td><br />
<td>Mokelembembe Mokeev</td><br />
<td></td><br />
<td>-8 (Southern California)</td><br />
<td>Web Developer (PHP and MySQL)</td><br />
<td>Interested in seeing running on PowerPC Macs which it is. So, when I can, I'll compile and test on PowerPC Mac (PowerBook G4) and submit reports and then update the wiki if need on installing on Mac. Also have a Ubuntu 7.10 server that I can do testing on too.</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:devalnor|devalnor]]</td><br />
<td>Devalnor</td><br />
<td>M. Watkin</td><br />
<td></td><br />
<td>+1 (Belgium)</td><br />
<td></td><br />
<td>Small Patch code, bug reports, and updating the wiki.</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Ezekiel|Ezekiel]]</td><br />
<td>Ezekiel</td><br />
<td>Ezekiel Zabelin</td><br />
<td></td><br />
<td>+1 </td><br />
<td>http://www.yosims.com </td><br />
<td>Concepts, business aspects of virtual worlds - web developer (PHP, MySQL, Javascript, LSL) </td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Diva|diva]]</td><br />
<td>Crista Lopes</td><br />
<td>Diva Canto</td><br />
<td>Diva Canto or Crista Lopes in as many grids as possible</td><br />
<td>-8 </td><br />
<td>UC Irvine and http://metaverseink.com </td><br />
<td>Search, general architecture</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Buggmaster|Buggmaster]]</td><br />
<td>Mike D</td><br />
<td>Bug Master</td><br />
<td>None</td><br />
<td>-8 </td><br />
<td>http://www.adultmetaverse.com</td><br />
<td>Grid, Data/Web PHP/PERL/MySQL</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Nixnerd|nixnerd]]</td><br />
<td>Richmund</td><br />
<td>Dangerously Moody</td><br />
<td>None</td><br />
<td>GMT </td><br />
<td>http://www.integratedtechnologies.eu</td><br />
<td>Cross Platform Testing, Feedback, Bug Reporting</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:MoHax|mohax]]</td><br />
<td>Mo Hax</td><br />
<td>Mo Hax</td><br />
<td></td><br />
<td>-5 Eastern</td><br />
<td>IBM</td><br />
<td>Testing, Feedback, Content Contributions, Bug Reporting, Documenting, Development</td><br />
</tr><br />
<br />
<tr><br />
<td>[[User:Ideia Boa|Ideia Boa]]</td><br />
<td>Joao Lopes</td><br />
<td>Ideia Boa</td><br />
<td>Ideia Boa or Boa Ideia in as many grids as possible</td><br />
<td>+1</td><br />
<td>http://www.clubslportugues.com</td><br />
<td>Testing, testing, and more testing! Trying to get into OpenSim code for now. Updating the original wiki and translating the OpenSim Wiki into Portugueses and reporting on OpenSim</td><br />
</tr><br />
<br />
<br />
</table><br />
[[Category:Main]]<br />
[[Category:Development]]</div>DrScofieldhttp://opensimulator.org/wiki/Talk:Console-less_OpenSimTalk:Console-less OpenSim2008-04-29T15:26:52Z<p>DrScofield: just for the record: permission to use original text</p>
<hr />
<div>the original text comes from [http://xyzzyxyzzy.net/2008/04/29/console-less-opensim/ xyzzy xyzzy]. as that has a different license, i just want to add for the record that i, as the original author, am fine with cross licensing the text to the OpenSim wiki. --- [[User:DrScofield|DrScofield]] 08:26, 29 April 2008 (PDT)</div>DrScofieldhttp://opensimulator.org/wiki/Console-less_OpenSimConsole-less OpenSim2008-04-29T15:08:25Z<p>DrScofield: removed redundant header</p>
<hr />
<div>normally opensim will only run in console mode: whenever you start OpenSim you will end up at a prompt inside OpenSim's very own console &mdash; which is very convenient if you want to manage it that way. it is rather inconvenient if you want to start OpenSim as a daemon in the background (e.g., from <code>/etc/init.d/opensim</code>) and control it via the <code>RemoteAdminPlugin</code>, for example.<br />
<br />
as of OpenSim's subversion release r4400 the basic support for running OpenSim without such a console is in the code base and all you need to do is invoke OpenSim with the <code>-background True</code> commandline parameter:<br />
<br />
% mono --debug OpenSim.exe -background True<br />
<br />
'''note: that is just a single dash for the <code>-background</code> option!'''<br />
<br />
to shutdown a console-less OpenSim instance, use the following <code>shutdown.py</code> script (also located in <code>share/python/console</code>):<br />
<br />
<pre><br />
#!/usr/bin/python<br />
# -*- encoding: utf-8 -*-<br />
<br />
import ConfigParser<br />
import xmlrpclib<br />
import optparse<br />
import os.path<br />
<br />
if __name__ == '__main__':<br />
parser = optparse.OptionParser()<br />
parser.add_option('-c', '--config', dest = 'config', help = 'config file', metavar = 'CONFIG')<br />
parser.add_option('-s', '--server', dest = 'server', help = 'URI for the grid server', metavar = 'SERVER')<br />
parser.add_option('-p', '--password', dest = 'password', help = 'password for the grid server', metavar = 'PASSWD')<br />
(options, args) = parser.parse_args()<br />
<br />
configFile = options.config<br />
if not configFile:<br />
if os.path.isfile(os.path.expanduser('~/.opensim-console.rc')):<br />
configFile = os.path.expanduser('~/.opensim-console.rc')<br />
if not configFile:<br />
parser.error('missing option config')<br />
sys.exit(1)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.readfp(open(configFile))<br />
<br />
server = config.get('opensim', 'server')<br />
password = config.get('opensim', 'password')<br />
<br />
if options.server: server = options.server<br />
if options.password: password = options.password<br />
<br />
gridServer = xmlrpclib.Server(server)<br />
res = gridServer.admin_shutdown({'password': password})<br />
<br />
if res['success'] == 'true':<br />
print 'shutdown of %s initiated' % server<br />
else:<br />
print 'shutdown of %s failed' % server<br />
<br />
</pre><br />
<br />
you can either pass in the server URI and password to use via commandline parameters, or you can create <code>.opensim-console.rc</code> in your home directory and set default values:<br />
<br />
<pre><br />
[opensim]<br />
server = http://127.0.0.1:9000/<br />
password = secret<br />
</pre><br />
<br />
then all you need to do to shutdown your OpenSim server is invoke <code>shutdown.py</code><br />
<br />
the goal is to extend <code>shutdown.py</code> into a remote console of sorts.<br />
<br />
''(adapted from [http://xyzzyxyzzy.net/2008/04/29/console-less-opensim/ xyzzy xyzzy])'''</div>DrScofieldhttp://opensimulator.org/wiki/User_DocumentationUser Documentation2008-04-29T15:07:26Z<p>DrScofield: typo... but looked very french ;-)</p>
<hr />
<div>{{Template:Quicklinks}}<br />
__NOTOC__<br />
==Initial Setup==<br />
* [[Download]] - Download instructions<br />
* [[OpenSim Build Instructions|Build Instructions]] - How to build and compile OpenSim from Source<br />
* [[OpenSim Configuration|Configuration]] - How to get your OpenSim server up and running<br />
* [[Connecting]] - How to connect a compatible viewer to OpenSim<br />
* [[Troubleshooting]] - How to trouble shoot your OpenSim installation.<br />
* [[Tips]] - Useful tips from users like you<br />
* [[FAQ]] - Frequently Asked Questions<br />
<br />
==Administrator Guide==<br />
* [[Server Commands]] - Commands to control OpenSim<br />
* [[Custom Libraries]] - Describes how to add custom content to your OpenSim server<br />
* [[Automating Tasks]] - How to make administrating a walk in the park<br />
* [[Network Settings]] - NAT, Ports, Services and more...<br />
* [[Management]] - All about being an effective administrator/moderator<br />
* [[Performance]] - How to tweak OpenSim's performance<br />
* [[Console-less OpenSim]] - How to run OpenSim without console<br />
<br />
==Scripting==<br />
* [[Scripting Documentation]] - Everything you need to know about OpenSim scripting<br />
* [[Scripting Library]] - A list of example scripts<br />
<br />
==Tutorials==<br />
* [[OSGrid Region Registration]] - Describes how to link your region into OS-Grid<br />
* [[Hints & Tricks]] - A page for Hints and Tricks<br />
* [[Using L3DT]] - How to create custom terrains<br />
* [[Production Environment]] - How to setup a complete OpenSim installation(Linux)<br />
* [[Chapter & Metaverse - Rock Vacirca's Blog]] - Entry for 15 April 2008 - How to access a standalone simulator remotely, and invite your friends in<br />
<br />
==Contribution Policy==<br />
* [[User_Wiki_Conventions|User Wiki Conventions]] - Read this carefully, before adding content to the wiki<br />
[[Category:Users]]<br />
<cleanpage title=hide cats=hide /></div>DrScofieldhttp://opensimulator.org/wiki/User_DocumentationUser Documentation2008-04-29T15:06:35Z<p>DrScofield: linking in Console-less OpenSim page</p>
<hr />
<div>{{Template:Quicklinks}}<br />
__NOTOC__<br />
==Initial Setup==<br />
* [[Download]] - Download instructions<br />
* [[OpenSim Build Instructions|Build Instructions]] - How to build and compile OpenSim from Source<br />
* [[OpenSim Configuration|Configuration]] - How to get your OpenSim server up and running<br />
* [[Connecting]] - How to connect a compatible viewer to OpenSim<br />
* [[Troubleshooting]] - How to trouble shoot your OpenSim installation.<br />
* [[Tips]] - Useful tips from users like you<br />
* [[FAQ]] - Frequently Asked Questions<br />
<br />
==Administrator Guide==<br />
* [[Server Commands]] - Commands to control OpenSim<br />
* [[Custom Libraries]] - Describes how to add custom content to your OpenSim server<br />
* [[Automating Tasks]] - How to make administrating a walk in the park<br />
* [[Network Settings]] - NAT, Ports, Services and more...<br />
* [[Management]] - All about being an effective administrator/moderator<br />
* [[Performance]] - How to tweak OpenSim's performance<br />
* [[Console-les OpenSim]] - How to run OpenSim without console<br />
<br />
==Scripting==<br />
* [[Scripting Documentation]] - Everything you need to know about OpenSim scripting<br />
* [[Scripting Library]] - A list of example scripts<br />
<br />
==Tutorials==<br />
* [[OSGrid Region Registration]] - Describes how to link your region into OS-Grid<br />
* [[Hints & Tricks]] - A page for Hints and Tricks<br />
* [[Using L3DT]] - How to create custom terrains<br />
* [[Production Environment]] - How to setup a complete OpenSim installation(Linux)<br />
* [[Chapter & Metaverse - Rock Vacirca's Blog]] - Entry for 15 April 2008 - How to access a standalone simulator remotely, and invite your friends in<br />
<br />
==Contribution Policy==<br />
* [[User_Wiki_Conventions|User Wiki Conventions]] - Read this carefully, before adding content to the wiki<br />
[[Category:Users]]<br />
<cleanpage title=hide cats=hide /></div>DrScofieldhttp://opensimulator.org/wiki/Console-less_OpenSimConsole-less OpenSim2008-04-29T15:05:04Z<p>DrScofield: instructions on how to start OpenSim console-less and how to shut it down again</p>
<hr />
<div>=== Console-less OpenSim ===<br />
normally opensim will only run in console mode: whenever you start OpenSim you will end up at a prompt inside OpenSim's very own console &mdash; which is very convenient if you want to manage it that way. it is rather inconvenient if you want to start OpenSim as a daemon in the background (e.g., from <code>/etc/init.d/opensim</code>) and control it via the <code>RemoteAdminPlugin</code>, for example.<br />
<br />
as of OpenSim's subversion release r4400 the basic support for running OpenSim without such a console is in the code base and all you need to do is invoke OpenSim with the <code>-background True</code> commandline parameter:<br />
<br />
% mono --debug OpenSim.exe -background True<br />
<br />
'''note: that is just a single dash for the <code>-background</code> option!'''<br />
<br />
to shutdown a console-less OpenSim instance, use the following <code>shutdown.py</code> script (also located in <code>share/python/console</code>):<br />
<br />
<pre><br />
#!/usr/bin/python<br />
# -*- encoding: utf-8 -*-<br />
<br />
import ConfigParser<br />
import xmlrpclib<br />
import optparse<br />
import os.path<br />
<br />
if __name__ == '__main__':<br />
parser = optparse.OptionParser()<br />
parser.add_option('-c', '--config', dest = 'config', help = 'config file', metavar = 'CONFIG')<br />
parser.add_option('-s', '--server', dest = 'server', help = 'URI for the grid server', metavar = 'SERVER')<br />
parser.add_option('-p', '--password', dest = 'password', help = 'password for the grid server', metavar = 'PASSWD')<br />
(options, args) = parser.parse_args()<br />
<br />
configFile = options.config<br />
if not configFile:<br />
if os.path.isfile(os.path.expanduser('~/.opensim-console.rc')):<br />
configFile = os.path.expanduser('~/.opensim-console.rc')<br />
if not configFile:<br />
parser.error('missing option config')<br />
sys.exit(1)<br />
<br />
config = ConfigParser.ConfigParser()<br />
config.readfp(open(configFile))<br />
<br />
server = config.get('opensim', 'server')<br />
password = config.get('opensim', 'password')<br />
<br />
if options.server: server = options.server<br />
if options.password: password = options.password<br />
<br />
gridServer = xmlrpclib.Server(server)<br />
res = gridServer.admin_shutdown({'password': password})<br />
<br />
if res['success'] == 'true':<br />
print 'shutdown of %s initiated' % server<br />
else:<br />
print 'shutdown of %s failed' % server<br />
<br />
</pre><br />
<br />
you can either pass in the server URI and password to use via commandline parameters, or you can create <code>.opensim-console.rc</code> in your home directory and set default values:<br />
<br />
<pre><br />
[opensim]<br />
server = http://127.0.0.1:9000/<br />
password = secret<br />
</pre><br />
<br />
then all you need to do to shutdown your OpenSim server is invoke <code>shutdown.py</code><br />
<br />
the goal is to extend <code>shutdown.py</code> into a remote console of sorts.<br />
<br />
''(adapted from [http://xyzzyxyzzy.net/2008/04/29/console-less-opensim/ xyzzy xyzzy])'''</div>DrScofieldhttp://opensimulator.org/wiki/Talk:RemoteAdminTalk:RemoteAdmin2008-03-06T14:28:39Z<p>DrScofield: + added permission to use code example</p>
<hr />
<div>just to confirm that i gave permission to use the code example from http://xyzzyxyzzy.net/2008/01/23/using-pythons-xmlrpclib-with-opensim/ under the OpenSim BSD-style license. [[User:DrScofield|DrScofield]] 06:28, 6 March 2008 (PST)</div>DrScofield