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
<?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>

