package com.planet_ink.coffee_mud.WebMacros;
import com.planet_ink.coffee_web.interfaces.*;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.JournalsLibrary.ForumJournalFlags;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.util.*;
/*
Copyright 2003-2016 Bo Zimmerman
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
public class JournalFunction extends StdWebMacro
{
@Override public String name() { return "JournalFunction"; }
@Override
public String runMacro(HTTPRequest httpReq, String parm, HTTPResponse httpResp)
{
if(!CMProps.getBoolVar(CMProps.Bool.MUDSTARTED))
return CMProps.getVar(CMProps.Str.MUDSTATUS);
final java.util.Map<String,String> parms=parseParms(parm);
final String journalName=httpReq.getUrlParameter("JOURNAL");
if(journalName==null)
return "Function not performed -- no Journal specified.";
final Clan setClan=CMLib.clans().getClan(httpReq.getUrlParameter("CLAN"));
final JournalsLibrary.ForumJournal forum=CMLib.journals().getForumJournal(journalName,setClan);
final MOB M = Authenticate.getAuthenticatedMob(httpReq);
if(CMLib.journals().isArchonJournalName(journalName))
{
if((M==null)||(!CMSecurity.isASysOp(M)))
return " @break@";
}
if(parms.containsKey("DESTROYFOREVER"))
{
if((forum!=null)&&(!forum.authorizationCheck(M, ForumJournalFlags.ADMIN)))
return "Destruction cancelled -- You are not authorized to delete this forum.";
if(!CMSecurity.isAllowedEverywhere(M,CMSecurity.SecFlag.JOURNALS))
return "Destruction cancelled -- You are not authorized.";
CMLib.database().DBDeleteJournal(journalName, null);
return "Journal "+journalName+" deleted.";
}
if(parms.containsKey("SUBSCRIBE"))
{
if(forum==null)
return "Subscription cancelled -- no forum.";
if(CMLib.journals().subscribeToJournal(journalName, M.Name(), true))
{
return "Now subscribed to "+journalName+".";
}
return "New subscribtion to "+journalName+" failed.";
}
if(parms.containsKey("UNSUBSCRIBE"))
{
if(forum==null)
return "UnSubscription cancelled -- no forum.";
if(CMLib.journals().unsubscribeFromJournal(journalName, M.Name(), true))
{
return "Now unsubscribed from "+journalName+".";
}
return "Unsubscription from "+journalName+" failed -- were you ever subscribed?";
}
String from="Anonymous";
if(M!=null)
from=M.Name();
if(parms.containsKey("NEWPOST"))
{
if((forum!=null)&&(!forum.authorizationCheck(M, ForumJournalFlags.POST)))
return "Post not submitted -- Unauthorized.";
String to=httpReq.getUrlParameter("TO");
if((to==null)||(M==null)||(to.equalsIgnoreCase("all")))
to="ALL";
if((!to.equals("ALL"))&&(!to.toUpperCase().trim().startsWith("MASK=")))
{
if(!CMLib.players().playerExists(to) && (!CMLib.players().accountExists(to)))
return "Post not submitted -- TO user does not exist. Try 'All'.";
to=CMStrings.capitalizeAndLower(to);
}
else
if(journalName.equalsIgnoreCase(CMProps.getVar(CMProps.Str.MAILBOX))
&&(!CMSecurity.isAllowedEverywhere(M,CMSecurity.SecFlag.JOURNALS)))
return "Post not submitted -- You are not authorized to send email to ALL.";
String subject=httpReq.getUrlParameter("SUBJECT");
if(subject==null)
subject="";
final String parent=httpReq.getUrlParameter("PARENT");
if((subject.length()==0)&&(parent==null))
return "Post not submitted -- No subject!";
if((parent!=null)&&(parent.length()>0)&&(subject.length()==0))
{
JournalEntry parentEntry = null;
parentEntry=CMLib.database().DBReadJournalEntry(journalName, parent);
if(parentEntry!=null)
subject="RE: "+parentEntry.subj();
}
final String date=httpReq.getUrlParameter("DATE");
final String icon=httpReq.getUrlParameter("MSGICON");
final List<String> flags=CMParms.parseCommas(httpReq.getUrlParameter("FLAGS"), true);
if((flags.size()>0)&&(forum!=null)&&(!forum.authorizationCheck(M, ForumJournalFlags.ADMIN)))
return "Post not submitted -- Unauthorized flags.";
final String text=httpReq.getUrlParameter("NEWTEXT");
if((text==null)||(text.length()==0))
return "Post not submitted -- No text!";
if(journalName.equalsIgnoreCase(CMProps.getVar(CMProps.Str.MAILBOX))
&&(CMProps.getIntVar(CMProps.Int.MAXMAILBOX)>0)
&&(!to.equalsIgnoreCase("ALL")))
{
final int count=CMLib.database().DBCountJournal(journalName,null,to);
if(count>=CMProps.getIntVar(CMProps.Int.MAXMAILBOX))
return "Post not submitted -- Mailbox is full!";
}
final JournalEntry msg = (JournalEntry)CMClass.getCommon("DefaultJournalEntry");
msg.from(from);
msg.subj(clearWebMacros(subject));
msg.msg(clearWebMacros(text));
if((date!=null) && (CMath.isLong(date)))
msg.date(CMath.s_long(date));
else
msg.date(System.currentTimeMillis());
msg.update(System.currentTimeMillis());
msg.parent((parent==null)?"":parent);
msg.msgIcon((icon==null)?"":icon);
if(flags.contains("STUCKY"))
msg.attributes(msg.attributes()|JournalEntry.ATTRIBUTE_STUCKY);
if(flags.contains("PROTECTED"))
msg.attributes(msg.attributes()|JournalEntry.ATTRIBUTE_PROTECTED);
msg.data("");
msg.to(to);
// check for dups
final List<JournalEntry> chckEntries = CMLib.database().DBReadJournalMsgsNewerThan(journalName, to, msg.date()-1);
for(final JournalEntry entry : chckEntries)
if((entry.date() == msg.date())
&&(entry.from().equals(msg.from()))
&&(entry.subj().equals(msg.subj()))
&&(entry.parent().equals(msg.parent())))
return "";
CMLib.database().DBWriteJournal(journalName,msg);
JournalInfo.clearJournalCache(httpReq, journalName);
if(parent!=null)
CMLib.database().DBTouchJournalMessage(parent);
CMLib.journals().clearJournalSummaryStats(forum);
return "Post submitted.";
}
else
if(parms.containsKey("ADMINSUBMIT"))
{
if(forum==null)
return "Changes not submitted -- Unsupported.";
else
if(!forum.authorizationCheck(M, ForumJournalFlags.ADMIN))
return "Changes not submitted -- Unauthorized.";
final String longDesc=fixForumString(httpReq.getUrlParameter("LONGDESC"));
final String shortDesc=fixForumString(httpReq.getUrlParameter("SHORTDESC"));
final String imgPath=httpReq.getUrlParameter("IMGPATH");
final JournalsLibrary.JournalSummaryStats stats = CMLib.journals().getJournalStats(forum);
if(stats == null)
return "Changes not submitted -- No Stats!";
if(longDesc!=null)
stats.longIntro(clearWebMacros(longDesc));
if(shortDesc!=null)
stats.shortIntro(clearWebMacros(shortDesc));
if(imgPath!=null)
stats.imagePath(clearWebMacros(imgPath));
CMLib.database().DBUpdateJournalStats(journalName, stats);
CMLib.journals().clearJournalSummaryStats(forum);
return "Changed applied.";
}
String parent=httpReq.getUrlParameter("JOURNALPARENT");
if(parent==null)
parent="";
String dbsearch=httpReq.getUrlParameter("DBSEARCH");
if(dbsearch==null)
dbsearch="";
final String page=httpReq.getUrlParameter("JOURNALPAGE");
final String mpage=httpReq.getUrlParameter("MESSAGEPAGE");
final List<JournalEntry> msgs=JournalInfo.getMessages(journalName,forum,page,mpage,parent,dbsearch,httpReq.getRequestObjects());
String msgKey=httpReq.getUrlParameter("JOURNALMESSAGE");
int cardinalNumber = CMath.s_int(httpReq.getUrlParameter("JOURNALCARDINAL"));
String srch=httpReq.getUrlParameter("JOURNALMESSAGESEARCH");
if(srch!=null)
srch=srch.toLowerCase();
final boolean doThemAll=parms.containsKey("EVERYTHING");
if(doThemAll)
{
final JournalEntry entry = JournalInfo.getNextEntry(msgs, null);
if(entry==null)
msgKey="";
else
msgKey=entry.key();
cardinalNumber=1;
}
final StringBuffer messages=new StringBuffer("");
boolean keepProcessing=((msgKey!=null)&&(msgKey.length()>0));
String fieldSuffix="";
while(keepProcessing)
{
if(doThemAll)
{
parms.clear();
parms.put("EVERYTHING","EVERYTHING");
final String fate=httpReq.getUrlParameter("FATE"+msgKey);
final String replyemail=httpReq.getUrlParameter("REPLYEMAIL"+msgKey);
cardinalNumber = CMath.s_int(httpReq.getUrlParameter("CARDINAL"+msgKey));
if((fate!=null)&&(fate.length()>0)&&(CMStrings.isUpperCase(fate)))
parms.put(fate,fate);
if((replyemail!=null)&&(replyemail.length()>0)&&(CMStrings.isUpperCase(replyemail)))
parms.put(replyemail,replyemail);
if(parms.size()==1)
{
JournalEntry entry = JournalInfo.getNextEntry(msgs, msgKey);
while((entry!=null) && (!CMLib.journals().canReadMessage(entry,srch,M,parms.containsKey("NOPRIV"))))
entry = JournalInfo.getNextEntry(msgs, entry.key());
if(entry==null)
keepProcessing=false;
else
msgKey=entry.key();
continue;
}
fieldSuffix=msgKey;
}
else
keepProcessing=false;
JournalEntry entry = JournalInfo.getEntry(msgs, msgKey);
if((entry==null)&&parms.containsKey("DELETEREPLY"))
entry=CMLib.database().DBReadJournalEntry(journalName, msgKey);
if(entry == null)
return "Function not performed -- illegal journal message specified.<BR>";
if(!doThemAll)
entry.cardinal(cardinalNumber);
final String to=entry.to();
if((M!=null)
&&(CMSecurity.isAllowedAnywhere(M,CMSecurity.SecFlag.JOURNALS)||(to.equalsIgnoreCase(M.Name())))
&&((forum==null)||(forum.authorizationCheck(M, ForumJournalFlags.READ))))
{
if(parms.containsKey("REPLY"))
{
if((forum!=null)&&(!forum.authorizationCheck(M, ForumJournalFlags.REPLY)))
return "Reply not submitted -- Unauthorized.";
final String text=httpReq.getUrlParameter("NEWTEXT"+fieldSuffix);
if((text==null)||(text.length()==0))
messages.append("Reply to #"+cardinalNumber+" not submitted -- No text!<BR>");
else
{
CMLib.database().DBWriteJournalReply(journalName,entry.key(),from,"","",clearWebMacros(text));
CMLib.journals().clearJournalSummaryStats(forum);
JournalInfo.clearJournalCache(httpReq, journalName);
messages.append("Reply to #"+cardinalNumber+" submitted<BR>");
}
}
else
if(parms.containsKey("EMAIL"))
{
if((forum!=null)&&(!forum.authorizationCheck(M, ForumJournalFlags.REPLY)))
return "Email not submitted -- Unauthorized.";
final String replyMsg=httpReq.getUrlParameter("NEWTEXT"+fieldSuffix);
if(replyMsg.length()==0)
messages.append("Email to #"+cardinalNumber+" not submitted -- No text!<BR>");
else
{
final String toName=entry.from();
final MOB toM=CMLib.players().getLoadPlayer(toName);
if((toM==null)||(toM.playerStats()==null)||(toM.playerStats().getEmail().indexOf('@')<0))
messages.append("Player '"+toName+"' does not exist, or has no email address.<BR>");
else
{
CMLib.database().DBWriteJournal(CMProps.getVar(CMProps.Str.MAILBOX),
M.Name(),
toM.Name(),
"RE: "+entry.subj(),
clearWebMacros(replyMsg));
JournalInfo.clearJournalCache(httpReq, journalName);
messages.append("Email to #"+cardinalNumber+" queued<BR>");
}
}
}
if(parms.containsKey("DELETE")||parms.containsKey("DELETEREPLY"))
{
if((forum!=null)&&(!forum.authorizationCheck(M, ForumJournalFlags.ADMIN)))
return "Delete not authorized.";
CMLib.database().DBDeleteJournal(journalName,entry.key());
if(parms.containsKey("DELETEREPLY")&&(entry.parent()!=null)&&(entry.parent().length()>0))
{
// this constitutes a threaded reply -- update the counter
final JournalEntry parentEntry=CMLib.database().DBReadJournalEntry(journalName, entry.parent());
if(parentEntry!=null)
CMLib.database().DBUpdateMessageReplies(parentEntry.key(),parentEntry.replies()-1);
JournalInfo.clearJournalCache(httpReq, journalName);
httpReq.addFakeUrlParameter("JOURNALMESSAGE",entry.parent());
httpReq.addFakeUrlParameter("JOURNALPARENT","");
if(cardinalNumber==0)
cardinalNumber=entry.cardinal();
if(cardinalNumber==0)
messages.append("Reply deleted.<BR>");
else
messages.append("Reply #"+cardinalNumber+" deleted.<BR>");
}
else
{
if(cardinalNumber==0)
cardinalNumber=entry.cardinal();
if(cardinalNumber==0)
messages.append("Message deleted.<BR>");
else
messages.append("Message #"+cardinalNumber+" deleted.<BR>");
JournalInfo.clearJournalCache(httpReq, journalName);
httpReq.addFakeUrlParameter("JOURNALMESSAGE","");
}
CMLib.journals().clearJournalSummaryStats(forum);
}
else
if(parms.containsKey("EDIT"))
{
if((entry.to().equals(M.Name()))
||((forum!=null)&&(!forum.authorizationCheck(M, ForumJournalFlags.ADMIN)))
||CMSecurity.isAllowedAnywhere(M,CMSecurity.SecFlag.JOURNALS))
{
final String text=httpReq.getUrlParameter("NEWTEXT"+fieldSuffix);
if((text==null)||(text.length()==0))
messages.append("Edit to #"+cardinalNumber+" not submitted -- No text!<BR>");
else
{
long attributes=0;
if((forum!=null)&&(forum.authorizationCheck(M, ForumJournalFlags.ADMIN)))
{
String ISSTUCKY=httpReq.getUrlParameter("ISSTICKY"+fieldSuffix);
if(ISSTUCKY==null)
ISSTUCKY=httpReq.getUrlParameter("ISSTUCKY"+fieldSuffix);
if((ISSTUCKY!=null)&&(ISSTUCKY.equalsIgnoreCase("on")))
attributes|=JournalEntry.ATTRIBUTE_STUCKY;
final String ISPROTECTED=httpReq.getUrlParameter("ISPROTECTED"+fieldSuffix);
if((ISPROTECTED!=null)&&(ISPROTECTED.equalsIgnoreCase("on")))
attributes|=JournalEntry.ATTRIBUTE_PROTECTED;
}
CMLib.database().DBUpdateJournal(entry.key(), entry.subj(), clearWebMacros(text), attributes);
if(cardinalNumber==0)
cardinalNumber=entry.cardinal();
if(cardinalNumber==0)
messages.append("Message modified.<BR>");
else
messages.append("Message #"+cardinalNumber+" modified.<BR>");
JournalInfo.clearJournalCache(httpReq, journalName);
if((entry.parent()!=null)&&(entry.parent().length()>0))
{
httpReq.addFakeUrlParameter("JOURNALMESSAGE",entry.parent());
httpReq.addFakeUrlParameter("JOURNALPARENT","");
}
CMLib.journals().clearJournalSummaryStats(forum);
}
}
else
return "Delete not authorized.";
}
else
if(CMSecurity.isAllowedAnywhere(M,CMSecurity.SecFlag.JOURNALS))
{
if(parms.containsKey("TRANSFER"))
{
if((forum!=null)&&(!forum.authorizationCheck(M, ForumJournalFlags.ADMIN)))
return "Email not submitted -- Unauthorized.";
final String journal=httpReq.getUrlParameter("NEWJOURNAL"+fieldSuffix);
if((journal==null) || (journal.length()==0))
messages.append("Transfer #"+cardinalNumber+" not completed -- No journal!<BR>");
String realName=null;
if(journal!=null)
for(final Enumeration<JournalsLibrary.CommandJournal> e=CMLib.journals().commandJournals();e.hasMoreElements();)
{
final JournalsLibrary.CommandJournal CMJ=e.nextElement();
if(journal.equalsIgnoreCase(CMJ.NAME())
||journal.equalsIgnoreCase(CMJ.NAME()+"s")
||journal.equalsIgnoreCase(CMJ.JOURNAL_NAME()))
{
realName=CMJ.JOURNAL_NAME();
break;
}
}
if(realName==null)
realName=CMLib.database().DBGetRealJournalName(journal);
if((realName==null)&&(journal!=null))
realName=CMLib.database().DBGetRealJournalName(journal.toUpperCase());
if(realName==null)
messages.append("The journal '"+journal+"' does not presently exist. Aborted.<BR>");
else
{
CMLib.journals().clearJournalSummaryStats(forum);
CMLib.database().DBDeleteJournal(journalName,entry.key());
if(journalName.toUpperCase().startsWith("SYSTEM_"))
entry.update(System.currentTimeMillis());
CMLib.database().DBWriteJournal(realName,entry);
CMLib.journals().clearJournalSummaryStats(forum);
JournalInfo.clearJournalCache(httpReq, journalName);
httpReq.addFakeUrlParameter("JOURNALMESSAGE","");
messages.append("Message #"+cardinalNumber+" transferred<BR>");
}
}
}
else
messages.append("You are not allowed to perform this function on message #"+cardinalNumber+".<BR>");
}
if(keepProcessing)
{
cardinalNumber++;
entry = JournalInfo.getNextEntry(msgs, msgKey);
while((entry!=null) && (!CMLib.journals().canReadMessage(entry,srch,M,parms.containsKey("NOPRIV"))))
entry = JournalInfo.getNextEntry(msgs, entry.key());
if(entry==null)
keepProcessing=false;
else
msgKey=entry.key();
}
}
return messages.toString();
}
public String fixForumString(String s)
{
if(s==null)
return "";
final int x=s.toUpperCase().indexOf("<P>");
final int y=s.toUpperCase().lastIndexOf("</P>");
if((x>=0)&&(y>x))
{
return s.substring(0,x)+s.substring(x+3,y)+s.substring(y+4);
}
return s;
}
}