Ganomede client library


Keywords
game, server, client, as3, actionscript, node
License
GPL-2.0+
Install
npm install ganomede@1.0.2

Documentation

Ganomede

This is a multi-language client-side library to interact with a Ganomede server.

For now, it supports:

  • Javascript with NodeJS
  • Actionscript 3 (AIR and Flash Player)

Author

Jean-Christophe Hoelt hoelt@fovea.cc

License

GPL v3

High-level concepts

  • Ganomede:
    • single entry point to an array of services, potentially running on different clusters
  • GanomedeClient:
    • entry point to a single cluster

Javascript Documentation

API

Initialization

First thing, you have to create a ganomede client and initialize it.

You can selected individually which subsystem you'd like to enable. By default all are disabled.

var ganomede = require("ganomede");
var client = ganomede.createClient("http://ganomede.server.com:12000", {
    registry: { enabled: true },
    users: { enabled: true },
    notifications: { enabled: true },
    invitations: { enabled: true },
    games: {
        enabled: true,
        type: "mygame/v1"
    }
});
client.initialize()
    .then(function() {
        console.log("Initialization OK");
    })
    .error(function(err) {
        trace("Initialization ERROR");
    });

Registry

The registry module allows you to retrieve informations about running services.

var registry = client.registry;
for (var i = 0; i < registry.services.length; ++i) {
    var service = registry.services[i];
    console.log(" - " + service.type + " version " + service.version);
}

The code above will display the list of services as retrieves at initialization or at the last call to getServices. If you really want the most up-to-date, non-cached list of running services, you can:

registry.getServicesAsync()
    .then(function() {
        for (var i = 0; i < registry.services.length; ++i) {
            var service = registry.services[i];
            console.log(" - " + service.type + " version " + service.version);
        }
    });

Users management

The users module allows you to manage user session (registration, login, profile (registration, login, profile).

To retrieve the client's GanomedeUsers instance:

var users = client.users;

Sign up

Create a new GanomedeUser and sign him up.

var me = new ganomede.GanomedeUser({
    username: 'testsignup',
    givenName: 'Test',
    surname: 'Ganomede Signup',
    email: 'testsignup@fovea.cc',
    password: 'Password1234!'
});
users.signUp(me)
    .then(function() {
        console.log("I am now authenticated");
    })
    .error(function(err) {
        console.log("Registration failed");
        if (err.apiCode == ganomede.ApiError.ALREADY_EXISTS)
            console.log("User already exists");
    });

Login

Create a new GanomedeUser with a username and password, login:

var me = new ganomede.GanomedeUser({
    username: 'testlogin',
    password: 'Password1234!'
});
users.login(me)
    .then(function() {
        console.log("I am now logged in");
    })
    .error(function(err):void {
        console.log("Loggin failed");
        if (err.apiCode == ganomede.ApiError.INVALID) {
            console.log("Login failed");
            console.log(err.data.message);
        }
    });

Profile

users.fetch(users.me)
    .then(function(user) {
        console.log(user.email);
        console.log(user.givenName);
        console.log(user.surname);
    });

Invitations

The invitations module allows you to manage the users invitations (send, accept, reject, cancel).

To retrieve the client's GanomedeInvitations instance:

var invitations = client.invitations;

Note: the array of invitations is gonna be this of the logged in user.

class GanomedeInvitation

fields:

    var id:String;
    var gameId:String;
    var type:String;
    var to:String;
    var from:String;
    var index:Int;

methods:

  • constructor(obj)
  • toJSON()
  • fromJSON(obj)

List invitations

var array = client.invitations.asArray();

Returns and array of GanomedeInvitation, the module handles keeping this list up to date.

If you wanna make sure to request the list from the server:

client.invitations.refreshArray()
.then(function() {
    // client.invitations.asArray has been updated
});

Create an invitation

var invitation = new ganomede.GanomedeInvitation({
    type: "triominos/v1",
    to: "joe",
    gameId: "dummy"
});

client.invitations.add(invitation)
.then(function() {
    console.log("invitation success");
})
.error(function invitationError(err) {
    console.error("invitation error");
    console.dir(err);
    process.exit(1);
});

Cancel an invitations

Retrieve the invitation to cancel from the array of invitations. Then:

client.invitations.cancel(invitation)
.then(function() {
    console.log("invitation cancelled");
})
.error(function cancelError(err) {
    console.error("invitation cancel error");
});

Accept or refuse an invitation

Like cancel, but the methods are called accept and refuse.

Listen to updates

Whenever there's a change in the list of invitations, the "ganomede.change" event is triggered by the invitations module.

client.invitations.on("ganomede.change", function() {
    // list of invitations has been updated
});

Untested but may work...?

Notifications

var notifications = client.notifications;

Send a notification

var notification = new ganomede.GanomedeNotification({
    to:   "username",
    from: "invitations/v1",
    type: "received",
    data: {
        from: "otheruser",
        gameId: "123"
    }
});
notifications.apiSecret = "1234567890";
notifications.send(notifications)
.then(...)
.error(...);

Listen to notifications

notifications.listenTo("invitations/v1", function(event) {
    if (event.notification.type === "received") {
        console.log("invitation received from " + event.notification.data.from);
    }
});

Games

The games module allows you to manage the users games (list, leave).

To retrieve the client's GanomedeGames instance:

var games = client.games;

Note: the array of games is gonna be this of the logged in user.

class GanomedeGame

fields:

    var id:String;
    var type:String;
    var players:Array of String;
    var status:String;
    var url:String;

methods:

  • constructor(obj)
  • toJSON()
  • fromJSON(obj)

valid statuses are:

  • inactive
  • active
  • gameover

url gives the address of the ganomede server handling this game. If different from the currently used ganomede server, you'll need to create a new ganomede client to play this game.

List Games

var array = client.games.asArray();

Returns and array of GanomedeGame, the module handles keeping this list up to date.

If you wanna make sure to request the list from the server:

client.games.refreshArray()
.then(function() {
    // client.games.asArray has been updated
});

Contribute

AS3 Documentation

Getting started

Install Adobe Air, make sure air tools are in the PATH.

To get help about compiling and running the project.

make

API Documentation

Initialization

First thing, you have to create a ganomede client and initialize it.

var client:GanomedeClient = new GanomedeClient("http://ganomede.server.com:12000");
client.initialize()
    .then(function():void {
        trace("Initialization OK");
    })
    .error(function():void {
        trace("Initialization ERROR");
    });

Registry

The registry module allows you to retrieve informations about running services.

var registry:GanomedeRegistry = client.registry;
for (var i:int = 0; i < registry.services.length; ++i) {
    var service:GanomedeService = registry.services[i];
    trace(" - " + service.type + " version " + service.version);
}

The code above will display the list of services as retrieves at initialization or at the last call to getServices. If you really want the most up-to-date, non-cached list of running services, you can:

registry.getServicesAsync()
    .then(function():void {
        for (var i:int = 0; i < registry.services.length; ++i) {
            var service:GanomedeService = registry.services[i];
            trace(" - " + service.type + " version " + service.version);
        }
    });

Users management

The users module allows you to manage user session (registration, login, profile).

To retrieve the client's GanomedeUsers instance:

var users:GanomedeUsers = client.users;

Sign up

Create a new GanomedeUser and sign him up.

var me:GanomedeUser = new GanomedeUser({
    username: 'testsignup',
    givenName: 'Test',
    surname: 'Ganomede Signup',
    email: 'testsignup@fovea.cc',
    password: 'Password1234!'
});
users.signUp(me)
    .then(function():void {
        trace("I am now authenticated");
    })
    .error(function(err:ApiError):void {
        trace("Registration failed");
        if (err.apiCode == ALREADY_EXISTS)
            trace("User already exists");
    });

Login

Create a new GanomedeUser with a username and password, login:

var me:GanomedeUser = new GanomedeUser({
    username: 'testlogin',
    password: 'Password1234!'
});
users.login(me)
    .then(function():void {
        trace("I am now logged in");
    })
    .error(function(err:ApiError):void {
        trace("Loggin failed");
        if (err.apiCode == ApiError.INVALID) {
            trace("Login failed");
            trace(err.data.message);
        }
    });

Profile

users.fetch(users.me)
    .then(function(user:GanomedeUser):void {
        trace(user.email);
        trace(user.givenName);
        trace(user.surname);
    });