42 votes

Comment mettre en place des badges?

J'ai donné à penser à la mise en œuvre de badges (tout comme les badges, ici, sur un Débordement de Pile) et pense qu'il serait difficile sans les services de Windows, mais je voudrais éviter si possible.

Je suis venu avec un plan pour mettre en œuvre quelques exemples:

  • Audobiographer: Vérifier si tous les champs dans le profil est rempli.
  • Auteurs: Lors d'un commentaire de vérifier si le nombre de commentaires égal à 10, si donc attribuer le badge.
  • Bonne Réponse: au moment de voter jusqu'vérifier pour voir si vote le score est de 25 ou plus.

Comment cela pourrait-il être mis en œuvre dans la base de données? Ou serait d'une autre manière de mieux?

41voto

Rex M Points 80372

Un semblable-à-Stackoverflow mise en œuvre est en fait beaucoup plus simple que vous avez décrite, basée sur des morceaux de l'info lâchée par l'équipe à chaque fois dans un certain temps.

Dans la base de données, il vous suffit de stocker une collection d' BadgeID-UserID des paires de piste qui a de quoi (et un comte ou un rowID pour permettre à de multiples récompenses pour certains badges).

Dans l'application, il est un travailleur de l'objet pour chaque badge type. L'objet est dans le cache, et quand le cache expire, le travailleur exécute sa propre logique pour déterminer qui devrait recevoir le badge et de faire les mises à jour, et puis il ré-insère lui-même dans le cache:

public abstract class BadgeJob
{
    protected BadgeJob()
    {
        //start cycling on initialization
        Insert();
    }

    //override to provide specific badge logic
    protected abstract void AwardBadges();

    //how long to wait between iterations
    protected abstract TimeSpan Interval { get; }

    private void Callback(string key, object value, CacheItemRemovedReason reason)
    {
        if (reason == CacheItemRemovedReason.Expired)
        {
            this.AwardBadges();
            this.Insert();
        }
    }

    private void Insert()
    {
        HttpRuntime.Cache.Add(this.GetType().ToString(),
            this,
            null,
            Cache.NoAbsoluteExpiration,
            this.Interval,
            CacheItemPriority.Normal,
            this.Callback);
    }
}

Et une mise en œuvre concrète:

public class CommenterBadge : BadgeJob
{
    public CommenterBadge() : base() { }

    protected override void AwardBadges()
    {
        //select all users who have more than x comments 
        //and dont have the commenter badge
        //add badges
    }

    //run every 10 minutes
    protected override TimeSpan Interval
    {
        get { return new TimeSpan(0,10,0); }
    }
}

4voto

spinon Points 6362

Emplois. C'est la clé. Travaux hors processus qui s'exécutent à des intervalles définis pour vérifier les critères que vous avez mentionnés. Je ne pense pas que vous ayez même besoin d'un service Windows à moins que des ressources externes ne soient nécessaires pour définir les niveaux. En fait, je pense que StackOverflow utilise également les travaux pour leurs calculs.

0voto

Dustin Laine Points 22815

Vous pouvez utiliser des déclencheurs et vérifier lors de la mise à jour ou de l'insertion, puis, si vos conditions sont remplies, ajoutez un badge. Cela semblerait moins le faire. Commencez la détente en frappant dans 3, 2, 1 ...

0voto

griegs Points 14142

les commentaires doivent être stockées dans la base de données de droit? ensuite, je pense qu'il y a deux principales façons de le faire.

1) lorsqu'un utilisateur se connecte, vous obtenez un nombre de commentaires. c'est obvisously pas l'approche souhaitée comme le comte pourrait prendre beaucoup de temps

2) lorsqu'un utilisateur poste un commentaire, vous pouvez soit faire un comte et de stocker le comte avec l'utilisation de détails ou vous pourriez faire un trigger qui s'exécute lorsqu'un commentaire est ajouté. le déclencheur serait alors d'obtenir les détails de la nouvellement créée commentaire, saisissez l'id d'utilisateur, obtenir un décompte et les conserver à l'encontre de l'utilisateur dans une table d'une certaine sorte.

j'aime l'idée d'un déclencheur que votre programme peut retourner w/attente pour sql server pour faire ses trucs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X