290 lines
8.8 KiB
Python
290 lines
8.8 KiB
Python
# CFGuilds.py - classes for crossfire guilds
|
|
#
|
|
# Copyright (C) 2004 Todd Mitchell
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
#
|
|
# The author can be reached via e-mail at temitchell@sourceforge.net
|
|
|
|
import Crossfire
|
|
|
|
from time import localtime, strftime, time
|
|
import os
|
|
import sys
|
|
from CFDataFile import CFDataFile, CFData
|
|
|
|
def GuildUpdate():
|
|
sys.path.append(os.path.join(Crossfire.DataDirectory(), Crossfire.MapDirectory(), 'templates', 'guild'))
|
|
from guilds import guilds
|
|
guildlisting = list(map(lambda x: x.id, guilds))
|
|
Crossfire.Log(Crossfire.LogDebug, 'Found guilds: %s' % guildlisting)
|
|
for guild in guildlisting:
|
|
if not CFGuildHouses().info(guild):
|
|
if CFGuildHouses().add_guild(guild):
|
|
Crossfire.Log(Crossfire.LogInfo,'New Guild: %s' %guild)
|
|
|
|
def SearchGuilds(player):
|
|
guildlist = CFGuildHouses().list_guilds()
|
|
for guild in guildlist:
|
|
memberlist = CFGuild(guild).list_members()
|
|
for member in memberlist:
|
|
if member == player:
|
|
return guild
|
|
return 0
|
|
|
|
class CFGuildHouses:
|
|
'''Inter-Guild management class'''
|
|
|
|
def __init__(self):
|
|
guildhousesheader= ['Founded_Date', 'Points', 'Status', 'Quest_points']
|
|
self.status=['active', 'suspended', 'probation', 'inactive']
|
|
self.guildhouselist = CFData('GuildHouses_log', guildhousesheader)
|
|
self.pointscap = 2000000000
|
|
self.qpcap = 2000000000
|
|
|
|
def info(self, name):
|
|
record = self.guildhouselist.get_record(name)
|
|
if record:
|
|
return record
|
|
else:
|
|
return 0
|
|
|
|
def list_guilds(self):
|
|
return self.guildhouselist.get_keys()
|
|
|
|
def add_guild(self, name):
|
|
record={'#' : name
|
|
,'Founded_Date' : 'never'
|
|
,'Points' : 0
|
|
,'Status' : 'inactive'
|
|
,'Quest_points': 0
|
|
}
|
|
try:
|
|
self.guildhouselist.put_record(record)
|
|
return 1
|
|
except:
|
|
return 0
|
|
|
|
def establish(self, name):
|
|
record = self.info(name)
|
|
date = strftime("%a, %d %b %Y", localtime(time()))
|
|
if record:
|
|
record['Founded_Date'] = date
|
|
record['Status'] = 'active'
|
|
self.guildhouselist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
|
|
def change_status(self, name, status):
|
|
record = self.info(name)
|
|
if record:
|
|
if self.status.count(status) != 0:
|
|
record['Status'] = status
|
|
self.guildhouselist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
else:
|
|
return 0
|
|
|
|
def add_questpoints(self, name, number):
|
|
record = self.info(name)
|
|
if record:
|
|
temp = int(record['Quest_points'])
|
|
if temp + number >= self.qpcap:
|
|
temp = self.qpcap
|
|
else:
|
|
temp = temp + number
|
|
record['Quest_points'] = temp
|
|
self.guildhouselist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
|
|
def update_points(self, name, number):
|
|
record = self.info(name)
|
|
if record:
|
|
temp = int(record['Points'])
|
|
if temp + number >= self.pointscap:
|
|
temp = self.pointscap
|
|
else:
|
|
temp = temp + number
|
|
record['Points'] = temp
|
|
self.guildhouselist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
|
|
class CFGuild:
|
|
|
|
def __init__(self, guildname):
|
|
self.guildname = guildname
|
|
guildheader = ['Join_date', 'Rank', 'Status', 'Dues', 'Demerits', 'Quest_points']
|
|
self.ranks=['Initiate', 'Novice', 'Guildman', 'Journeyman', 'Master', 'GuildMaster']
|
|
self.status=['suspended', 'probation', 'good']
|
|
self.duescap = 1000000 #arbitrary limit on dues (if you change it remember it currently is an int)
|
|
self.demeritcap = 100 #arbitrary limit on demerits
|
|
self.qpcap = 100
|
|
guild_name = '%s_log' %self.guildname
|
|
self.guildlist = CFData(guild_name, guildheader)
|
|
|
|
def add_member(self, name, rank):
|
|
date = strftime("%a, %d %b %Y", localtime(time()))
|
|
record={'#' : name
|
|
,'Join_date' : date
|
|
,'Rank' : rank
|
|
,'Status' : 'good'
|
|
,'Dues' : 0
|
|
,'Demerits' : 0
|
|
,'Quest_points': 0
|
|
}
|
|
try:
|
|
self.guildlist.put_record(record)
|
|
return 1
|
|
except:
|
|
return 0
|
|
|
|
def remove_member(self, name):
|
|
try:
|
|
self.guildlist.remove_record(name)
|
|
return 1
|
|
except:
|
|
return 0
|
|
|
|
def info(self, name):
|
|
record = self.guildlist.get_record(name)
|
|
if record:
|
|
return record
|
|
else:
|
|
return 0
|
|
|
|
def list_members(self):
|
|
return self.guildlist.get_keys()
|
|
|
|
def count_members(self):
|
|
number = len(self.guildlist.get_keys())
|
|
return number
|
|
|
|
def add_demerits(self, name, number):
|
|
record = self.info(name)
|
|
if record:
|
|
temp = int(record['Demerits'])
|
|
if temp + number >= self.demeritcap:
|
|
temp = self.demeritcap
|
|
else:
|
|
temp = temp + number
|
|
record['Demerits'] = temp
|
|
self.guildlist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
|
|
def remove_demerits(self, name, number):
|
|
record = self.info(name)
|
|
if record:
|
|
temp = int(record['Demerits'])
|
|
if temp - number <=0:
|
|
temp = 0
|
|
else:
|
|
temp = temp - number
|
|
record['Demerits'] = temp
|
|
self.guildlist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
|
|
def add_questpoints(self, name, number):
|
|
record = self.info(name)
|
|
if record:
|
|
temp = int(record['Quest_points'])
|
|
if temp + number >= self.qpcap:
|
|
temp = self.qpcap
|
|
else:
|
|
temp = temp + number
|
|
record['Quest_points'] = temp
|
|
self.guildlist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
|
|
def pay_dues(self, name, number):
|
|
record = self.info(name)
|
|
if record:
|
|
temp = int(record['Dues'])
|
|
if temp + number >= self.duescap:
|
|
temp = self.duescap
|
|
else:
|
|
temp = temp + number
|
|
record['Dues'] = temp
|
|
self.guildlist.put_record(record)
|
|
# add points to the guild record
|
|
CFGuildHouses().update_points(self.guildname,number)
|
|
return 1
|
|
else:
|
|
return 0
|
|
|
|
def clear_dues(self, name, number):
|
|
record = self.info(name)
|
|
if record:
|
|
record['Dues'] = 0
|
|
self.guildlist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
|
|
def change_status(self, name, status):
|
|
record = self.info(name)
|
|
if record:
|
|
if self.status.count(status) != 0:
|
|
record['Status'] = status
|
|
self.guildlist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
else:
|
|
return 0
|
|
|
|
def promote_member(self, name):
|
|
record = self.info(name)
|
|
if record:
|
|
currentrank = record['Rank']
|
|
if currentrank != 'GuildMaster':
|
|
ranknum = self.ranks.index(currentrank)
|
|
newrank = ranknum+1
|
|
record['Rank'] = self.ranks[newrank]
|
|
self.guildlist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
else:
|
|
return 0
|
|
|
|
def demote_member(self, name):
|
|
record = self.info(name)
|
|
if record:
|
|
currentrank = record['Rank']
|
|
if currentrank != 'Initiate':
|
|
ranknum = self.ranks.index(currentrank)
|
|
Crossfire.Log(Crossfire.LogDebug, "ranknum = %d"%ranknum)
|
|
newrank = ranknum-1
|
|
record['Rank'] = self.ranks[newrank]
|
|
self.guildlist.put_record(record)
|
|
return 1
|
|
else:
|
|
return 0
|
|
else:
|
|
return 0
|