We've recently moved hosts! Please report any weirdness with the wiki (or spam) on Utopia.

NuDOC Protocol RFC/Draft Protocol XML Schema revision 01

From BBSWiki

Jump to: navigation, search
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://bbswiki.evernex.com/wiki/NuDOC" targetNamespace="http://bbswiki.evernex.com/wiki/NuDOC" elementFormDefault="qualified" attributeFormDefault="unqualified">
 <xs:element name="BBSMessage">
   <xs:annotation>
     <xs:documentation>The root element containing messages passed between BBS server and client.</xs:documentation>
   </xs:annotation>
   <xs:complexType>
     <xs:choice>
       <xs:element name="ClientRequest" type="ClientRequest">
         <xs:annotation>
           <xs:documentation>A request from the client to the BBS server.</xs:documentation>
         </xs:annotation>
       </xs:element>
       <xs:element name="ServerResponse" type="ServerResponse">
         <xs:annotation>
           <xs:documentation>A response to a ClientRequest (with one exception -- LoginPrompt)</xs:documentation>
         </xs:annotation>
       </xs:element>
       <xs:element name="ServerBroadcast" type="ServerBroadcast">
         <xs:annotation>
           <xs:documentation>A broadcast, or push, message from the server to the client.  Not in response to anything.  The client must be ready to accept broadcasts.</xs:documentation>
         </xs:annotation>
       </xs:element>
       <xs:element name="ClientBroadcastResponse">
         <xs:annotation>
           <xs:documentation>Simple ACK or NAK of proper receipt of a ServerBroadcast.</xs:documentation>
         </xs:annotation>
         <xs:simpleType>
           <xs:restriction base="xs:string">
             <xs:enumeration value="ACK"/>
             <xs:enumeration value="NAK"/>
           </xs:restriction>
         </xs:simpleType>
       </xs:element>
     </xs:choice>
   </xs:complexType>
 </xs:element>
 <xs:complexType name="ControlSegment">
   <xs:annotation>
     <xs:documentation>A data type passed by the server with every message or broadcast it sends, containing a control message (one of ACK, NAK, RDY or PSH) and a (currently optional) numeric control code which can be used by clients, particularly i18n clients, to display a useful message.</xs:documentation>
   </xs:annotation>
   <xs:sequence>
     <xs:element name="ControlMessage">
       <xs:simpleType>
         <xs:restriction base="xs:string">
           <xs:enumeration value="REQ"/>
           <xs:enumeration value="ACK"/>
           <xs:enumeration value="NAK"/>
           <xs:enumeration value="PSH"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:element>
     <xs:element name="ControlCode" type="xs:int" minOccurs="0"/>
   </xs:sequence>
 </xs:complexType>
 <xs:complexType name="User">
   <xs:annotation>
     <xs:documentation>A data type containing details about a BBS user.  Which fields are used will depend on the context (LoginRequest vs a GetUserProfileResponse, etc.)</xs:documentation>
   </xs:annotation>
   <xs:sequence>
     <xs:element name="UserNumber" type="xs:int" minOccurs="0"/>
     <xs:element name="Username" type="xs:string" minOccurs="0"/>
     <xs:element name="Password" type="xs:string" minOccurs="0"/>
     <xs:element name="RealName" type="xs:string" minOccurs="0"/>
     <xs:element name="Address" type="xs:string" minOccurs="0"/>
     <xs:element name="City" type="xs:string" minOccurs="0"/>
     <xs:element name="StateProvince" type="xs:string" minOccurs="0"/>
     <xs:element name="PostCode" type="xs:string" minOccurs="0"/>
     <xs:element name="Phone" type="xs:string" minOccurs="0"/>
     <xs:element name="Email" type="xs:string" minOccurs="0"/>
     <xs:element name="WebURL" type="xs:string" minOccurs="0"/>
     <xs:element name="NumCalls" type="xs:int" minOccurs="0"/>
     <xs:element name="NumPosts" type="xs:int" minOccurs="0"/>
     <xs:element name="NumXes" type="xs:int" minOccurs="0"/>
     <xs:element name="CreateDate" type="xs:dateTime" minOccurs="0"/>
     <xs:element name="ConnectStatus" type="xs:string" minOccurs="0"/>
     <xs:element name="ConnectFrom" type="xs:string" minOccurs="0"/>
     <xs:element name="LastLogin" type="xs:dateTime" minOccurs="0"/>
     <xs:element name="LastLogout" type="xs:dateTime" minOccurs="0"/>
     <xs:element name="DoingField" type="xs:string" minOccurs="0"/>
     <xs:element name="ProfileText" minOccurs="0">
       <xs:simpleType>
         <xs:restriction base="xs:string">
           <xs:maxLength value="800"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:element>
     <xs:element name="VanityFlag" type="xs:string" minOccurs="0"/>
     <xs:element name="Flag" type="xs:string" minOccurs="0" maxOccurs="255"/>
     <xs:element name="StatusFlag" type="xs:string" minOccurs="0" maxOccurs="255"/>
   </xs:sequence>
 </xs:complexType>
 <xs:complexType name="Room">
   <xs:annotation>
     <xs:documentation>A data type containing details about a BBS room.</xs:documentation>
   </xs:annotation>
   <xs:sequence>
     <xs:element name="RoomNumber"/>
     <xs:element name="RoomName" type="xs:string" minOccurs="0"/>
     <xs:element name="LastMessage" type="xs:long" minOccurs="0"/>
     <xs:element name="FirstMessageUnread" type="xs:long" minOccurs="0"/>
     <xs:element name="RoomAides" minOccurs="0">
       <xs:complexType>
         <xs:sequence>
           <xs:element name="User" type="User" maxOccurs="255"/>
         </xs:sequence>
       </xs:complexType>
     </xs:element>
     <xs:element name="RoomInfo" type="xs:string" minOccurs="0"/>
     <xs:element name="RoomInfoUpdatedBy" minOccurs="0">
       <xs:complexType>
         <xs:sequence>
           <xs:element name="User" type="User"/>
         </xs:sequence>
       </xs:complexType>
     </xs:element>
     <xs:element name="RoomInfoLastUpdated" type="xs:dateTime" minOccurs="0"/>
   </xs:sequence>
 </xs:complexType>
 <xs:complexType name="MessageHeader">
   <xs:annotation>
     <xs:documentation>A message header, minus the actual message content.</xs:documentation>
   </xs:annotation>
   <xs:sequence>
     <xs:element name="User" type="User"/>
     <xs:element name="Room" type="Room"/>
     <xs:element name="MessageHeaderData">
       <xs:complexType>
         <xs:sequence>
           <xs:element name="Subject" type="xs:string"/>
           <xs:element name="DatePosted" type="xs:dateTime"/>
           <xs:element name="RoomMessageNumber" type="xs:long"/>
           <xs:element name="GlobalMessageNumber" type="xs:long"/>
           <xs:element name="GlobalParentNumber" type="xs:long"/>
         </xs:sequence>
       </xs:complexType>
     </xs:element>
   </xs:sequence>
 </xs:complexType>
 <xs:complexType name="MessageBody">
   <xs:annotation>
     <xs:documentation>Message content for a specific numbered message.</xs:documentation>
   </xs:annotation>
   <xs:sequence>
     <xs:element name="GlobalMessageNumber" type="xs:long"/>
     <xs:element name="MessageBodyText" type="xs:string"/>
   </xs:sequence>
 </xs:complexType>
 <xs:complexType name="ClientRequest">
   <xs:sequence>
     <xs:element name="ConnectionNonce" type="xs:int">
       <xs:annotation>
         <xs:documentation>Must be greater than the last value the server sent.</xs:documentation>
       </xs:annotation>
     </xs:element>
     <xs:choice>
       <xs:element name="LoginRequest">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="User" type="User"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="LogoutRequest">
         <xs:complexType/>
       </xs:element>
       <xs:element name="NewUserCheckRequest">
         <xs:annotation>
           <xs:documentation>Check if a new user of the given name can be created.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="User" type="User"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="NewUserPasswordCheckRequest">
         <xs:annotation>
           <xs:documentation>Checks the password in case account creation is passworded.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="AccountCreationPassword" type="xs:string"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="NewUserCreateRequest">
         <xs:annotation>
           <xs:documentation>Any of the profile info fields may be omitted except the mandatory ones as specified by the server in NewUserCheckResponse.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="User" type="User"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="UserHideProfileFieldsRequest">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="HideField" maxOccurs="7">
               <xs:simpleType>
                 <xs:restriction base="xs:string">
                   <xs:enumeration value="RealName"/>
                   <xs:enumeration value="Address"/>
                   <xs:enumeration value="City"/>
                   <xs:enumeration value="StateProvince"/>
                   <xs:enumeration value="PostCode"/>
                   <xs:enumeration value="Phone"/>
                   <xs:enumeration value="Email"/>
                 </xs:restriction>
               </xs:simpleType>
             </xs:element>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="UserChangeProfileTextRequest">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="User" type="User"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="UserProfileRequest">
         <xs:annotation>
           <xs:documentation>Either by name or by number.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="User" type="User"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="UserStatusRequest">
         <xs:annotation>
           <xs:documentation>Request online/offline status and status flags, either by name or by number.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="User" type="User"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="RoomDetailsRequest">
         <xs:annotation>
           <xs:documentation>Gets everything but roominfo.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="Room" type="Room"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="MessageHeadersInRangeRequest">
         <xs:annotation>
           <xs:documentation>Download all message headers in a range in a particular room. No delivery order guaranteed. Client should sort.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="Room" type="Room"/>
             <xs:element name="RoomMessageNumberRequestRange">
               <xs:complexType>
                 <xs:sequence>
                   <xs:element name="Start" type="xs:long"/>
                   <xs:element name="End" type="xs:long"/>
                 </xs:sequence>
               </xs:complexType>
             </xs:element>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="MessageBodyByGlobalRequest">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="GlobalMessageNumber" type="xs:long"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="WholistRequest">
         <xs:annotation>
           <xs:documentation>Data not returned in any order. Client should sort.</xs:documentation>
         </xs:annotation>
         <xs:complexType/>
       </xs:element>
       <xs:element name="SendeXpressRequest">
         <xs:annotation>
           <xs:documentation>By user name or number.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="User" type="User"/>
             <xs:element name="eXpressText">
               <xs:simpleType>
                 <xs:restriction base="xs:string">
                   <xs:maxLength value="800"/>
                 </xs:restriction>
               </xs:simpleType>
             </xs:element>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
     </xs:choice>
   </xs:sequence>
 </xs:complexType>
 <xs:complexType name="ServerResponse">
   <xs:sequence>
     <xs:element name="ConnectionNonce" type="xs:int"/>
     <xs:choice>
       <xs:element name="LoginPrompt">
         <xs:annotation>
           <xs:documentation>This is a "response" to the client's final ACK in the handshake. Contains the login splash screen, limited to 1920 characters (24x80).</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="BBSName" type="xs:string"/>
             <xs:element name="LoginSplash">
               <xs:simpleType>
                 <xs:restriction base="xs:string">
                   <xs:maxLength value="1920"/>
                 </xs:restriction>
               </xs:simpleType>
             </xs:element>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="LoginResponse">
         <xs:annotation>
           <xs:documentation>ACK or NAK the username/password offered by the client. If ACK, include some data and statistics. The LoginResponseData section is absent with a NAK.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="LoginResponseData" minOccurs="0">
               <xs:complexType>
                 <xs:sequence>
                   <xs:element name="LastLoginTimestamp" type="xs:dateTime"/>
                   <xs:element name="LastLogoutTimestamp" type="xs:dateTime"/>
                   <xs:element name="LastHost" type="xs:string"/>
                   <xs:element name="CallNum" type="xs:int"/>
                   <xs:element name="NumUsers" type="xs:int"/>
                   <xs:element name="eXpressState" type="xs:boolean">
                     <xs:annotation>
                       <xs:documentation>True if eXpress enabled.</xs:documentation>
                     </xs:annotation>
                   </xs:element>
                   <xs:element name="GuideState" type="xs:boolean">
                     <xs:annotation>
                       <xs:documentation>True if guide flag enabled.</xs:documentation>
                     </xs:annotation>
                   </xs:element>
                 </xs:sequence>
               </xs:complexType>
             </xs:element>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="LogoutResponse">
         <xs:annotation>
           <xs:documentation>ACK and close connection.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="NewUserCheckResponse">
         <xs:annotation>
           <xs:documentation>ACK if name available.  AccountCreationAllowed specifies whether the account can be created on this connection. It could be set to no by the sysops. </xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="NewUserCheckData">
               <xs:complexType>
                 <xs:sequence>
                   <xs:element name="AccountCreationAllowed" type="xs:boolean"/>
                   <xs:element name="AccountCreationPasswordProtected" type="xs:boolean"/>
                   <xs:element name="MandatoryField" maxOccurs="7">
                     <xs:simpleType>
                       <xs:restriction base="xs:string">
                         <xs:enumeration value="RealName"/>
                         <xs:enumeration value="Address"/>
                         <xs:enumeration value="City"/>
                         <xs:enumeration value="StateProvince"/>
                         <xs:enumeration value="PostCode"/>
                         <xs:enumeration value="Phone"/>
                         <xs:enumeration value="Email"/>
                       </xs:restriction>
                     </xs:simpleType>
                   </xs:element>
                 </xs:sequence>
               </xs:complexType>
             </xs:element>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="NewUserPasswordCheckResponse">
         <xs:annotation>
           <xs:documentation>ACK on password okay. NAK on wrong password.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="NewUserCreateResponse">
         <xs:annotation>
           <xs:documentation>ACK if account created, NAK if failure.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="UserHideProfileFieldsResponse">
         <xs:annotation>
           <xs:documentation/>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="UserChangeProfileTextResponse">
         <xs:annotation>
           <xs:documentation>ACK for anything that's not too long.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="UserProfileResponse">
         <xs:annotation>
           <xs:documentation>ACK if extant user and user can profile (not guest, twit, etc).. NAK on bad user or no permission. Lacks any hidden fields.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="User" type="User" minOccurs="0"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="UserStatusResponse">
         <xs:annotation>
           <xs:documentation>ACK if extant user and user can profile (not guest, twit, etc).. NAK on bad user or no permission. Returns user online/offline status and guide/op/Xdisable status etc.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="User" type="User" minOccurs="0"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="RoomDetailsResponse">
         <xs:annotation>
           <xs:documentation>ACK for extant room, NAK for non-extant or "hidden" room. Doesn't return roominfo-related stuff.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="Room" type="Room" minOccurs="0"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="MessageHeadersInRangeResponse">
         <xs:annotation>
           <xs:documentation>ACK for range with any valid messages, NAK for invalid range (for example, room message number ends at 1200 and range request is 1250-1300). No delivery order guaranteed. Client should sort.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="MessageHeader" type="MessageHeader" minOccurs="0" maxOccurs="unbounded"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="MessageBodyByGlobalResponse">
         <xs:annotation>
           <xs:documentation>ACK for message successfully retrieved. NAK for nonexistent message or one which user is not allowed to read.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="MessageBody" type="MessageBody" minOccurs="0"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="WholistResponse">
         <xs:annotation>
           <xs:documentation>Contains UserNumber, Username, City, StateProvince, ConnectFrom, DoingField, and any StatusFlags for each logged in user. Hidden fields will be omitted. Not in any order. Client should sort.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="User" type="User" maxOccurs="unbounded"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
       <xs:element name="SendeXpressResponse">
         <xs:annotation>
           <xs:documentation>ACK if eXpress received for sure. NAK on any problem.</xs:documentation>
         </xs:annotation>
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
     </xs:choice>
   </xs:sequence>
 </xs:complexType>
 <xs:complexType name="ServerBroadcast">
   <xs:sequence>
     <xs:choice>
       <xs:element name="eXpressBroadcast">
         <xs:complexType>
           <xs:sequence>
             <xs:element name="ControlSegment" type="ControlSegment"/>
             <xs:element name="User" type="User"/>
             <xs:element name="eXpressType">
               <xs:simpleType>
                 <xs:restriction base="xs:string">
                   <xs:enumeration value="Normal"/>
                   <xs:enumeration value="Guide"/>
                   <xs:enumeration value="Broadcast"/>
                 </xs:restriction>
               </xs:simpleType>
             </xs:element>
             <xs:element name="eXpressText" type="xs:string"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
     </xs:choice>
   </xs:sequence>
 </xs:complexType>
</xs:schema>
Personal tools