maps/python/CFGuilds.py

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