diff src/protocols/jabber/karma.c @ 3127:4e7cefc55971

[gaim-migrate @ 3142] Upgraded jabber to most recent stable version committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Thu, 04 Apr 2002 03:04:57 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/protocols/jabber/karma.c	Thu Apr 04 03:04:57 2002 +0000
@@ -0,0 +1,144 @@
+/* --------------------------------------------------------------------------
+ *
+ * License
+ *
+ * The contents of this file are subject to the Jabber Open Source License
+ * Version 1.0 (the "JOSL").  You may not copy or use this file, in either
+ * source code or executable form, except in compliance with the JOSL. You
+ * may obtain a copy of the JOSL at http://www.jabber.org/ or at
+ * http://www.opensource.org/.  
+ *
+ * Software distributed under the JOSL is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the JOSL
+ * for the specific language governing rights and limitations under the
+ * JOSL.
+ *
+ * Copyrights
+ * 
+ * Portions created by or assigned to Jabber.com, Inc. are 
+ * Copyright (c) 1999-2002 Jabber.com, Inc.  All Rights Reserved.  Contact
+ * information for Jabber.com, Inc. is available at http://www.jabber.com/.
+ *
+ * Portions Copyright (c) 1998-1999 Jeremie Miller.
+ * 
+ * Acknowledgements
+ * 
+ * Special thanks to the Jabber Open Source Contributors for their
+ * suggestions and support of Jabber.
+ * 
+ * Alternatively, the contents of this file may be used under the terms of the
+ * GNU General Public License Version 2 or later (the "GPL"), in which case
+ * the provisions of the GPL are applicable instead of those above.  If you
+ * wish to allow use of your version of this file only under the terms of the
+ * GPL and not to allow others to use your version of this file under the JOSL,
+ * indicate your decision by deleting the provisions above and replace them
+ * with the notice and other provisions required by the GPL.  If you do not
+ * delete the provisions above, a recipient may use your version of this file
+ * under either the JOSL or the GPL. 
+ * 
+ * 
+ * --------------------------------------------------------------------------*/
+#include "lib.h"
+
+void karma_copy(struct karma *new, struct karma *old)
+{
+    new->init        = old->init;
+    new->val         = old->val;
+    new->bytes       = old->bytes;
+    new->max         = old->max;
+    new->inc         = old->inc;
+    new->dec         = old->dec;
+    new->penalty     = old->penalty;
+    new->restore     = old->restore;
+    new->last_update = old->last_update;
+    new->reset_meter = old->reset_meter;
+}
+
+struct karma *karma_new(pool p)
+{
+    struct karma *new;
+    if(p == NULL)
+        return NULL;
+
+    new          = pmalloco(p, sizeof(struct karma));
+    new->init    = 0;
+    new->bytes   = 0;
+    new->val     = KARMA_INIT;
+    new->max     = KARMA_MAX;
+    new->inc     = KARMA_INC;
+    new->dec     = KARMA_DEC;
+    new->penalty = KARMA_PENALTY;
+    new->restore = KARMA_RESTORE;
+    new->last_update = 0;
+    new->reset_meter = KARMA_RESETMETER;
+
+    return new;
+}
+
+void karma_increment(struct karma *k)
+{
+    /* set the current time, and check if we can increment */
+    time_t cur_time = time(NULL);
+    int punishment_over = 0;
+    
+    /* only increment every KARMA_HEARTBEAT seconds */
+    if( ( k->last_update + KARMA_HEARTBEAT > cur_time ) && k->last_update != 0)
+        return;
+
+    /* if incrementing will raise >= 0 */
+    if( ( k->val < 0 ) && ( k->val + k->inc >= 0 ) )
+        punishment_over = 1;
+
+    /* increment the karma value */
+    k->val += k->inc;
+    if( k->val > k->max ) k->val = k->max; /* can only be so good */
+
+    /* lower our byte count, if we have good karma */
+    if( k->val > 0 ) k->bytes -= ( KARMA_READ_MAX(k->val) );
+    if( k->bytes < 0 ) k->bytes = 0;
+
+    /* our karma has *raised* to 0 */
+    if( punishment_over )
+    /* Set Restore value and clear byte meter */
+    {
+        k->val = k->restore;
+        /* Total absolution for transgression */
+        if(k->reset_meter) k->bytes = 0;
+    }
+
+    /* reset out counter */
+    k->last_update = cur_time;
+}
+
+void karma_decrement(struct karma *k, long bytes_read)
+{
+
+    /* Increment the bytes read since last since last karma_increment */
+    k->bytes += bytes_read;
+
+    /* Check if our byte meter has exceeded the Max bytes our meter is allowed. */
+
+    if(k->bytes > KARMA_READ_MAX(k->val))
+    {
+        /* Our meter has exceeded it's allowable lower our karma */
+        k->val -= k->dec;
+
+        /* if below zero, set to penalty */
+        if(k->val <= 0) k->val = k->penalty;
+    }
+}
+
+/* returns 0 on okay check, 1 on bad check */
+int karma_check(struct karma *k,long bytes_read)
+{
+    /* Check the need to increase or decrease karma */
+    karma_increment(k);
+    karma_decrement(k, bytes_read);
+
+    /* check its karma */
+    if(k->val <= 0)
+        return 1; /* bad */
+
+    /* everything is okay */
+    return 0;
+}