Not logged in. · Lost password · Register
Forum: agsXMPP SDK Support RSS
Avatar
mrOrbit #1
Member since Jan 2006 · 9 posts
Group memberships: Members
Show profile · Link to this post
Subject: Client register issue.
I set
_connection.RegisterAccount = true;
before connection to register client on the JabberD server instance. I have it installed on the my local machine.

It's perfectly register new jabber account on the server. But when i disconnect my client, jabber server drop user information and replace the file with user information on the following.

<xdb>
  <query
     xmlns='jabber:iq:last'
     last='1137584707'     
     xdbns='jabber:iq:last'>Disconnected</query>
</xdb>

But i expect see something like that.
<xdb>
  <query
    xmlns='jabber:iq:last'
    last='1137753903'
    xdbns='jabber:iq:last'>Registered</query>
  <password
    xmlns='jabber:iq:auth'
    xdbns='jabber:iq:auth'>1</password>
  <query
    xmlns='jabber:iq:register'
    xdbns='jabber:iq:register'>
    <username>sexy666</username>
    <password
      xmlns='jabber:iq:auth'>1</password>
    <x
      xmlns='jabber:x:delay'
      stamp='20060120T10:45:03'>registered</x>
  </query>
  <foo
    xdbns='jabber:x:offline'
    xmlns='jabber:x:offline'>
  <message
    from='ruspbn22015.ad5.ad.alcatel.com'
    to='sexy666@ruspbn22015.ad5.ad.alcatel.com'>
        <subject>Welcome!</subject>
    <body>
      Welcome to the Jabber server at localhost --
      we hope you enjoy this service! For information
      about how to use Jabber, visit the Jabber
      User&apos;s Guide at http://docs.jabber.org/</body>
    <x
      xmlns='jabber:x:delay'
      from='sexy666@ruspbn22015.ad5.ad.alcatel.com'
      stamp='20060120T10:45:03'>Offline Storage</x>
     </message>
   </foo>
   <zerok
    xmlns='jabber:iq:auth:0k'
    xdbns='jabber:iq:auth:0k'>
    <hash>68be966ad4ea8d456ae0697bb7cd2ba7ee2a8401</hash>
    <token>43D0BF32</token>
    <sequence>500</sequence>
   </zerok>
</xdb>

What i should do, to achive desired behavior from the JabberD server?
Avatar
Alex #2
Member since Feb 2003 · 4245 posts · Location: Germany
Group memberships: Administrators, Members
Show profile · Link to this post
Hello,

are you using the old jabberd on Windows? When yes its a well known server bug. Does it register the accoutn but you are not able to login again?

We also made fixes to registration for XMPP compliant servers and stream features. This code is in SVN but should not be related to your problem.

Alex
Alexander Gnauck
AG-Software
Avatar
Alex #3
Member since Feb 2003 · 4245 posts · Location: Germany
Group memberships: Administrators, Members
Show profile · Link to this post
which authentication did you configure on you server?
ZeroK is not implemented in the lib because it doesnt makt much sense and had bugs in jabberd 1.x too ;-)

Alex
Alexander Gnauck
AG-Software
Avatar
mrOrbit #4
Member since Jan 2006 · 9 posts
Group memberships: Members
Show profile · Link to this post
Subject: Jabber registration issue
I user JabberD-1.4.2.

Yes realy, i can't able to log on again :) You quitly understand my problem!!

I don't clearly understant your question about configuration of my server.
I user this one jabber.xml configuration file.

<jabber>

  <!--
  This is the Jabber server configuration file. The file is
  broken into different sections based on the services being
  managed by jabberd, the server daemon. Most of the important
  sections have comments and are easy to modify. You can find
  full instructions in the server howto, which is available at
  http://docs.jabber.org/. Note that when you see a tag like
  &quot;jabberd:cmdline&quot;, it's automatically replaced on startup
  with the command line flag passed in to jabberd. This enables
  you to override parameters set in this configuration file if
  necessary or desired. Also note as you comment things in and
  out that jabberd does not like comments within comments, so
  be careful with your XML. :)
  -->


  <!--
  The following <service/> section is for the session manager,
  the most important component within the server. This section
  contains the following types of information:

    * the server's hostname
    * other basic server information
    * the location of the session log file
    * email addresses for server administrators
    * the location of the server that provides update information
    * registration instructions for new users
    * a welcome message for new users
    * a list of agents with which users can register
    * load rules for the modules within the session manager

  -->

  <service id=&quot;sessions&quot;>

    <!--
    Change hostname below to something other than &quot;localhost&quot;,
    i.e., to the hostname or IP address of your Jabber server.
    Multiple <host/> entries are allowed - each one is for a
    separate virtual server. Note that each host entry must
    be on one line, the server doesn't like it otherwise! :)
    -->

    <host><jabberd:cmdline flag=&quot;h&quot;>ruspbn22015.ad5.ad.alcatel.com</jabberd:cmdline></host>

    <!--
    This is the custom configuration section for the
    Jabber session manager, a.k.a. &quot;JSM&quot;.
    -->

    <jsm xmlns=&quot;jabber:config:jsm&quot;>

      <!--
      The <filter/> section below determines settings
      for mod_filter, a server-side module built into
      JSM that enables users to set delivery rules for
      messages they receive (not yet supported by all
      clients. The <allow/> subsection specifies which
      conditions and actions to enable. High-level
      descriptions of each setting can be found below
      (see docs.jabber.org for full details):

      * <default/> - a user cannot delete this one, it's
        the default rule for delivering messages
      * <max_size/> - the maximum number of rules in a
        user's rule set (we don't want to overdo it!)
      * conditions...
        * <ns/> - matches the query xmlns attrib on an iq packet
        * <unavailable/> - matches when user is unavailable
        * <from/> - matches the sender of the message
        * <resource/> - matches the receiver's resource
        * <subject/> - matches the subject of the message
        * <body/> - matches the body of the message
        * <show/> - matches the show tag on the receiver's presence
        * <type/> - matches the type of the message
        * <roster/> - matches if the sender is in your roster
        * <group/> - matches if the sender is in the specified group
      * actions...
        * <error/> - replies with an error
        * <offline/> - stores the messages offline
        * <forward/> - forwards the message to another jid
        * <reply/> - sends a reply to the sender of the message
        * <continue/> - continues processing of the rules
        * <settype/> - changes the type of the message
      -->
      <filter>
          <default/>
          <max_size>100</max_size>
          <allow>
              <conditions>
                  <ns/>          <!-- Matches if the iq's xmlns is the same as the specified namespace -->
                  <unavailable/> <!-- Flag that matches when the reciever is unavailable (offline) -->
                  <from/>        <!-- Matches if the  sender's jid is the specified jid -->
                  <resource/>    <!-- Matches if the sender's resource (anything after the / in a jid) is the specified resource -->
                  <subject/>     <!-- Matches if the message's subject is the specified subject (no regex yet) -->
                  <body/>        <!-- Matches if the message body is the specified body (no regex yet) -->
                  <show/>        <!-- Matches if the receiver's presence has a show tag that is the same as the specified text -->
                  <type/>        <!-- Matches if the type of the message is the same as the specified text (&quot;normal&quot; is okay) -->
                  <roster/>      <!-- Flag that matches when the sender is in the receiver's roster -->
                  <group/>       <!-- Matches when the sender is in the specified group -->
              </conditions>
              <actions>
                  <error/>       <!-- Sends back an error message to the sender, with the specified text -->
                  <offline/>     <!-- Flag that stores the message offline -->
                  <forward/>     <!-- forwards the message to the specified jid -->
                  <reply/>       <!-- Sends back a reply to the sender with the specified text in the body -->
                  <continue/>    <!-- Flag that continues rule matching, after a rule matches -->
                  <settype/>     <!-- Changes the type of message to the specified type, before delivery to the receiver -->
              </actions>
          </allow>
      </filter>

      <!-- The server vCard -->

      <vCard>
        <FN>Jabber Server</FN>
        <DESC>A Jabber Server!</DESC>
        <URL>http://foo.bar/</URL>
      </vCard>

      <!--
      Registration instructions and required fields. The
      notify attribute will send the server administrator(s)
      a message after each valid registration if it is set
      to &quot;yes&quot;.
      -->

      <register notify=&quot;yes&quot;>
        <instructions>Choose a username and password to register with this server.</instructions>
        <name/>
        <email/>
      </register>

      <!--
      A welcome note that is sent to every new user who registers
      with your server. Comment it out to disable this function.
      -->

      <welcome>
        <subject>Welcome!</subject>
        <body>Welcome to the Jabber server at localhost -- we hope you enjoy this service! For information about how to use Jabber, visit the Jabber User's Guide at http://docs.jabber.org/</body>
      </welcome>

      <!--
      IDs with admin access - these people will receive admin
      messages (any message to=&quot;yourhostname&quot; is an admin
      message).  These addresses must be local ids, they cannot
      be remote addresses.

      Note that they can also send announcements to all
      users of the server, or to all online users. To use
      the announcement feature, you need to send raw xml and be
      logged in as one of the admin users. Here is the syntax
      for sending an announcement to online users:

        <message to=&quot;yourhostname/announce/online&quot;>
          <body>announcement here</body>
        </message>

        <message to=&quot;yourhostname/announce/motd&quot;>
          <body>message (of the day) that is sent only once to all users that are logged in and additionally to new ones as they log in</body>
        </message>

      Sending to /announce/motd/delete will remove any existing
      motd, and to /announce/motd/update will only update the motd
      without re-announcing to all logged in users.

      The <reply> will be the message that is automatically
      sent in response to any admin messages.
      -->

      <!--
      <admin>
        <read>support@localhost</read>
        <write>admin@localhost</write>
        <reply>
          <subject>Auto Reply</subject>
          <body>This is a special administrative address.  Your message was received and forwarded to server administrators.</body>
        </reply>
      </admin>
      -->

      <!--
      This is the resource that checks for updated versions
      of the Jabber server software. Note that you don't lose
      any functionality if you comment this out. Removing the
      <update/> config is especially a good strategy if your
      server is behind a firewall. If you want to use this
      feature, change 'localhost' to the hostname or IP address
      of your server, making sure that it is the same as your
      entry for <host/> above.

      <update><jabberd:cmdline flag=&quot;h&quot;>localhost</jabberd:cmdline></update>
      -->

      <!--
      This enables the server to automatically update the
      user directory when a vcard is edited.  The update is
      only sent to the first listed jud service below.  It is
      safe to remove this flag if you do not want any users
      automatically added to the directory.
      -->

      <vcard2jud/>

      <!--
      The <browse/> section identifies the transports and other
      services that are available from this server. Note that each
      entity identified here must exist elsewhere or be further
      defined in its own <service/> section below. These services
      will appear in the user interface of Jabber clients that
      connect to your server.
      -->

      <browse>

        <!--
        This is the default agent for the master Jabber User
        Directory, a.k.a. &quot;JUD&quot;, which is located at jabber.org.
        You can add separate <service/> sections for additional
        directories, e.g., one for a company intranet.
        -->

        <service type=&quot;jud&quot; jid=&quot;users.ruspbn22015.ad5.ad.alcatel.com&quot; name=&quot;Jabber User Directory&quot;>
          <ns>jabber:iq:search</ns>
          <ns>jabber:iq:register</ns>
        </service>

        <!--
        The following services are examples only, you will need to
        create/modify them to get them working on your Jabber
        server. See the README files for each service and/or the
        server howto for further information/instructions.
        -->

        <!-- we're commenting these out, of course :)

        <conference type=&quot;private&quot; jid=&quot;conference.localhost&quot; name=&quot;Private Conferencing&quot;/>

        <service type=&quot;aim&quot; jid=&quot;aim.localhost&quot; name=&quot;AIM Transport&quot;>
          <ns>jabber:iq:gateway</ns>
          <ns>jabber:iq:register</ns>
        </service>

        <service type=&quot;yahoo&quot; jid=&quot;yahoo.localhost&quot; name=&quot;Yahoo! Transport&quot;>
          <ns>jabber:iq:gateway</ns>
          <ns>jabber:iq:register</ns>
        </service>

        end of <service/> examples -->

      </browse>

    </jsm>

    <!--
    The following section dynamically loads the individual
    modules that make up the session manager. Remove or
    comment out modules to disable them. Note that the order
    of modules is important, since packets are delivered
    based on the following order!!
    -->

    <load main=&quot;jsm&quot;>
      <jsm>./libs/jsm.dll</jsm>
      <mod_echo>./libs/jsm.dll</mod_echo>
      <mod_roster>./libs/jsm.dll</mod_roster>
      <mod_time>./libs/jsm.dll</mod_time>
      <mod_vcard>./libs/jsm.dll</mod_vcard>
      <mod_last>./libs/jsm.dll</mod_last>
      <mod_version>./libs/jsm.dll</mod_version>
      <mod_announce>./libs/jsm.dll</mod_announce>
      <mod_agents>./libs/jsm.dll</mod_agents>
      <mod_browse>./libs/jsm.dll</mod_browse>
      <mod_admin>./libs/jsm.dll</mod_admin>
      <mod_filter>./libs/jsm.dll</mod_filter>
      <mod_offline>./libs/jsm.dll</mod_offline>
      <mod_presence>./libs/jsm.dll</mod_presence>
      <mod_auth_plain>./libs/jsm.dll</mod_auth_plain>
      <mod_auth_digest>./libs/jsm.dll</mod_auth_digest>
      <mod_auth_0k>./libs/jsm.dll</mod_auth_0k>
      <mod_log>./libs/jsm.dll</mod_log>
      <mod_register>./libs/jsm.dll</mod_register>
      <mod_xml>./libs/jsm.dll</mod_xml>
    </load>

  </service>

  <!-- OK, we've finished defining the Jabber Session Manager. -->

  <!-- The <xdb/> component handles all data storage, using the filesystem. -->

  <xdb id=&quot;xdb&quot;>
    <host/>
    <load>
        <xdb_file>./libs/xdb_file.dll</xdb_file>
    </load>
    <xdb_file xmlns=&quot;jabber:config:xdb_file&quot;>
      <spool><jabberd:cmdline flag='s'>./spool</jabberd:cmdline></spool>
    </xdb_file>
  </xdb>

  <!--
  The following service manages incoming client socket connections.
  There are several items you can set here to optimize performance:

    * authtime - default is unlimited, but you can set this to
      limit the amount of time allowed for authentication to be
      completed, e.g., <authtime>10</authtime> for 10 seconds

    * karma - this is an input/output rate limiting system that
      the Jabber team came up with to prevent bandwidth hogging.
      For details about karma, read the io section at the bottom
      and/or see docs.jabber.org. These are the low settings and
      apply per connection/socket and can be changed as desired.
  -->

  <service id=&quot;c2s&quot;>
    <load>
      <pthsock_client>./libs/pthsock_client.dll</pthsock_client>
    </load>
    <pthcsock xmlns='jabber:config:pth-csock'>
      <authtime/>
      <karma>
        <init>10</init>
        <max>10</max>
        <inc>1</inc>
        <dec>1</dec>
        <penalty>-6</penalty>
        <restore>10</restore>
      </karma>

      <!--
      Use these to listen on particular addresses and/or ports.
      <ip port=&quot;5222&quot;>127.0.0.1</ip>
      -->
      <ip port=&quot;5222&quot;/>

      <!--
      The <ssl/> tag acts pretty much like the <ip/> tag,
      except it defines that SSL is to be used on the
      ports and IP addresses specified. You must specify
      an IP address here, or the connections will fail.
      <ssl port='5223'>127.0.0.1</ssl>
      <ssl port='5224'>192.168.1.100</ssl>
      -->

    </pthcsock>
  </service>

  <!--
  This is the default server error logging component,
  which copies to a file and to STDERR.
  -->

  <log id='elogger'>
    <host/>
    <logtype/>
    <format>%d: [%t] (%h): %s</format>
    <file>error.log</file>
    <stderr/>
  </log>

  <!--
  This is the default server record logging component,
  which logs general statistical/tracking data.
  -->

  <log id='rlogger'>
    <host/>
    <logtype>record</logtype>
    <format>%d %h %s</format>
    <file>record.log</file>
  </log>

  <!-- The following two services are for handling server-to-server traffic. -->

  <!-- External asychronous DNS resolver -->

  <service id=&quot;dnsrv&quot;>
    <host/>
    <load>
      <dnsrv>./libs/dnsrv.dll</dnsrv>
    </load>
    <dnsrv xmlns=&quot;jabber:config:dnsrv&quot;>
      <resend service=&quot;_jabber._tcp&quot;>s2s</resend> <!-- for supporting SRV records -->
      <resend>s2s</resend>
    </dnsrv>
  </service>

  <!--
  The following 's2s' config handles server connections and
  dialback hostname verification.  The <legacy/> element is
  here to enable communication with old 1.0 servers. The
  karma settings are a little higher here to handle the
  higher traffic of server-to-server connections (read
  the io section below for more details, medium settings).
  -->

  <service id=&quot;s2s&quot;>
    <load>
      <dialback>./libs/dialback.dll</dialback>
    </load>
    <dialback xmlns='jabber:config:dialback'>
      <legacy/>
      <!-- Use these to listen on particular addresses and/or ports.
      <ip port=&quot;7000&quot;/>
      <ip port=&quot;5269&quot;>127.0.0.1</ip>
      -->
      <ip port=&quot;5269&quot;/>
      <karma>
        <init>50</init>
        <max>50</max>
        <inc>4</inc>
        <dec>1</dec>
        <penalty>-5</penalty>
        <restore>50</restore>
      </karma>
    </dialback>
  </service>

  <!--
  If you identified additional agents in the main <service/>
  section (see examples above), you'll need to define each
  of them here using a separate <service/> section for each
  <agent/> you identified. Note that the <agent/> sections
  determine what gets shown to clients that connect to your
  server, whereas the following <service/> sections define
  these services within the server itself. The following are
  examples only, you will need to create/modify them to get
  them working on your Jabber server. See the README files
  for each agent and/or the server howto for further
  information/instructions.
  -->

  <!-- we're commenting these out, of course :)

  <service id=&quot;conference&quot;>
    <load>
      <groupchat>/path/to/groupchat.dll</groupchat>
    </load>
    <host>conference.localhost</host>
  </service>

  <service id=&quot;irc&quot;>
    <host>irc.localhost</host>
  </service>

  <service id=&quot;aim.localhost&quot;>
    <accept>
      <ip/>
      <port>7009</port>
      <secret>jabber-rocks</secret>
    </accept>
  </service>

  <service id=&quot;yahoo.localhost&quot;>
    <accept>
      <ip/>
      <port>9001</port>
      <secret>jabber-rocks</secret>
    </accept>
  </service>

  end of <service/> examples -->

  <!--
  The following <io/> config initializes the top-level
  I/O, otherwise known as MIO (Managed Input/Output).
  -->

  <io>

    <!-- Set the default karma for *all* sockets -->
    <!-- definition of terms:

      * Avg. Throughput - The number of bytes you can
        send every second without incuring any penalty.

      * Burst Allowed - The maximum number of bytes you
        can send in 2 seconds without incurring any penalty.

      * Max Sustained Rate - If you send data as fast as
        you can, you will hit penalty, and will not be
        able to send for 10 seconds; the max sustained
        rate is the average rate you can dump data when
        you are dumping as much data as you can, as fast
        as you can.

      * Seconds to Recover from Burst - The amount of time
        it will take to reach Avg. Throughput capability
        after sending a max burst of data.

      * Penalty Length - The length of your penalty is
        determined according to this formula:
              abs(penalty) * Heartbeat seconds
        E.g., a penalty of -5 and heartbeat of 2 will
        cause your penalty length to be 10 seconds.
        Note that a penalty CANNOT be less than -100,
        otherwise strange things might happen.

    -->
    <!-- Example of Low Karma Limits
        Avg. Throughput: 1k-2k/s
        Burst Allowed To: 5.5k/s
        Max Sustained Rate: 485b/s
        Seconds to Recover from Burst: 20
        Penalty Length: 12 seconds
    <karma>
      <heartbeat>2</heartbeat>
      <init>10</init>
      <max>10</max>
      <inc>1</inc>
      <dec>1</dec>
      <penalty>-6</penalty>
      <restore>10</restore>
    </karma>
    -->

    <!-- Example of Medium Karma Limits
        Avg. Throughput: 5k-10k/s
        Burst Allowed: 125.5k/s
        Max Sustained Rate: 12.6k/s
        Seconds to Recover From Burst: 25
        Penalty Length: 10 seconds
    <karma>
      <heartbeat>2</heartbeat>
      <init>50</init>
      <max>50</max>
      <inc>4</inc>
      <dec>1</dec>
      <penalty>-5</penalty>
      <restore>50</restore>
    </karma>
    -->

    <!-- Example of High Karma Limits
        Avg. Throughput: 5k-10k/s
        Burst Allowed: 206k/s
        Max Sustained Rate: 34.3k/s
        Seconds to Recover from Burst: 21
        Penalty Length: 6 seconds
    <karma>
      <heartbeat>2</heartbeat>
      <init>64</init>
      <max>64</max>
      <inc>6</inc>
      <dec>1</dec>
      <penalty>-3</penalty>
      <restore>64</restore>
    </karma>
    -->

    <!--
    Set rate limits to monitor the number of connection
    attempts from a single IP, any more than [points]
    within [time] will engage the limit.  This setting
    applies to all incoming connections to any service,
    unless otherwise overridden by that service.
    -->

    <rate points=&quot;5000000&quot; time=&quot;25&quot;/>

    <!--
    The following section initializes SSL for top-level I/O.
    This works only when the server is compiled with openssl!
    -->
    <!--
    <ssl>
      <key ip='192.168.1.1'>/path/to/cert_and_key.pem</key>
      <key ip='192.168.1.100'>/path/to/other/cert_and_key.pem</key>
    </ssl>
    -->

    <!--
    The following section is used to allow or deny
    communications from specified IP networks or
    addressses. If there is no <allow/> section,
    then *all* IPs will be allowed to connect. If
    you allow one block, then only that block may
    connect. Note that <allow/> is checked before
    <deny/>, so if a specific address is allowed
    but the network for that address is denied,
    then that address will still be denied.
    -->
    <!--
    <allow><ip>127.0.0.0</ip><mask>255.255.255.0</mask></allow>
    <allow><ip>12.34.56.78</ip></allow>
    <deny><ip>22.11.44.0</ip><mask>255.255.255.0</mask></deny>
    -->

  </io>

  <!--
  This specifies the file to store the pid of the process in.
  <pidfile>./jabber.pid</pidfile>
  -->


</jabber>

PS. Thank you for quick response ^))
Avatar
Alex #5
Member since Feb 2003 · 4245 posts · Location: Germany
Group memberships: Administrators, Members
Show profile · Link to this post
Hello,

you should update your server or install another xmpp compliant server. Wildfire and eJabberd are a good choice. On Windows and linux. Jabberd 1.42 has lots of problems especially on windows. If you want to stay at jabberd 1.4x then you should grep the latest code from SVN and compile it.

Alex
Alexander Gnauck
AG-Software
Avatar
Alex #6
Member since Feb 2003 · 4245 posts · Location: Germany
Group memberships: Administrators, Members
Show profile · Link to this post
i also invite you to use our public server on ag-software.de for testing, and make sure you use the latest code from SVN when trying to register a new account on this server.

Alex
Alexander Gnauck
AG-Software
Avatar
mrOrbit #7
Member since Jan 2006 · 9 posts
Group memberships: Members
Show profile · Link to this post
Subject: Thank you
Hi Alex.

Thank you for help. Your advices is realy useful. I will try use another servers in next day.

Thank you for invitation using your server.

And yet one question. How i get get your source code from SVN? Could you briefily explain this topic, of get me link.


Regards Alexey
Avatar
Alex #8
Member since Feb 2003 · 4245 posts · Location: Germany
Group memberships: Administrators, Members
Show profile · Link to this post
Hello Alexey,

here is a good tutorial for tortoise svn:
http://www.cs.plu.edu/~dwolff/svn-tutorial/svn-tutorial.html
If recommend Tortoise or Rapid SVN for windows users.

I think the problem with jabberd 1.4 was, if you register the account, and login in the same session it doesnt store the information. And this is exactly what agsXMPP does. It registers the new accout, and will login with this information after it was registred successful.

Alex
Alexander Gnauck
AG-Software
Avatar
mrOrbit #9
Member since Jan 2006 · 9 posts
Group memberships: Members
Show profile · Link to this post
Subject: Register without login.
Thank you for SVN tutorial, it was realy useful for me.

And question.

Could i register account without login, with agxXMPP library?

--
Regargs Alexey.
Avatar
Alex #10
Member since Feb 2003 · 4245 posts · Location: Germany
Group memberships: Administrators, Members
Show profile · Link to this post
no, not without making changes to the library.

Alex
Alexander Gnauck
AG-Software
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Forum: agsXMPP SDK Support RSS