CString GetReply() { CString sReply = GetNV("Reply"); if (sReply.empty()) { sReply = "%nick% is currently away, try again later"; SetReply(sReply); } return ExpandString(sReply); }
CString ExpandReason() { CString sReason = m_sReason; if (sReason.empty()) sReason = SIMPLE_AWAY_DEFAULT_REASON; time_t iTime = time(nullptr); CString sTime = CUtils::CTime(iTime, GetUser()->GetTimezone()); sReason.Replace("%awaytime%", sTime); sReason = ExpandString(sReason); sReason.Replace("%s", sTime); // Backwards compatibility with previous // syntax, where %s was substituted with // sTime. ZNC <= 1.6.x return sReason; }
bool WriteISpoof() { if (m_pISpoofLockFile != nullptr) { return false; } m_pISpoofLockFile = new CFile; if (!m_pISpoofLockFile->TryExLock(GetNV("File"), O_RDWR | O_CREAT)) { delete m_pISpoofLockFile; m_pISpoofLockFile = nullptr; return false; } char buf[1024]; memset((char*)buf, 0, 1024); m_pISpoofLockFile->Read(buf, 1024); m_sOrigISpoof = buf; if (!m_pISpoofLockFile->Seek(0) || !m_pISpoofLockFile->Truncate()) { delete m_pISpoofLockFile; m_pISpoofLockFile = nullptr; return false; } CString sData = ExpandString(GetNV("Format")); // If the format doesn't contain anything expandable, we'll // assume this is an "old"-style format string. if (sData == GetNV("Format")) { sData.Replace("%", GetUser()->GetIdent()); } DEBUG("Writing [" + sData + "] to ident spoof file [" + m_pISpoofLockFile->GetLongName() + "] for user/network [" + GetUser()->GetUserName() + "/" + GetNetwork()->GetName() + "]"); m_pISpoofLockFile->Write(sData + "\n"); return true; }
void List(const CString& sCommand) { CTable Table; unsigned int index = 1; Table.AddColumn(t_s("Id", "list")); Table.AddColumn(t_s("Perform", "list")); Table.AddColumn(t_s("Expanded", "list")); for (const CString& sPerf : m_vPerform) { Table.AddRow(); Table.SetCell(t_s("Id", "list"), CString(index++)); Table.SetCell(t_s("Perform", "list"), sPerf); CString sExpanded = ExpandString(sPerf); if (sExpanded != sPerf) { Table.SetCell(t_s("Expanded", "list"), sExpanded); } } if (PutModule(Table) == 0) { PutModule(t_s("No commands in your perform list.")); } }
void List(const CString& sCommand) { CTable Table; unsigned int index = 1; Table.AddColumn("Id"); Table.AddColumn("Perform"); Table.AddColumn("Expanded"); for (VCString::const_iterator it = m_vPerform.begin(); it != m_vPerform.end(); ++it, index++) { Table.AddRow(); Table.SetCell("Id", CString(index)); Table.SetCell("Perform", *it); CString sExpanded = ExpandString(*it); if (sExpanded != *it) { Table.SetCell("Expanded", sExpanded); } } if (PutModule(Table) == 0) { PutModule("No commands in your perform list."); } }
void GetFormat(const CString& sLine) { PutModule("Format is set to: " + GetNV("Format")); PutModule("Format would be expanded to: " + ExpandString(GetNV("Format"))); }
void SetFormat(const CString& sLine) { SetNV("Format", sLine.Token(1, true)); PutModule("Format has been set to: " + GetNV("Format")); PutModule("Format would be expanded to: " + ExpandString(GetNV("Format"))); }
CString CUser::ExpandString(const CString& sStr) const { CString sRet; return ExpandString(sStr, sRet); }
void OnIRCConnected() override { for (const CString& sPerf : m_vPerform) { PutIRC(ExpandString(sPerf)); } }
virtual void OnIRCConnected() override { for (VCString::const_iterator it = m_vPerform.begin(); it != m_vPerform.end(); ++it) { PutIRC(ExpandString(*it)); } }
static int chat_UpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n) { struct chat *c = descriptor2chat(d); int special, gotabort, gottimeout, needcr; int TimedOut = c->TimedOut; static char arg_term; /* An empty string */ if (c->pause.state == TIMER_RUNNING) return 0; if (TimedOut) { log_Printf(LogCHAT, "Expect timeout\n"); if (c->nargptr == NULL) c->state = CHAT_FAILED; else { /* c->state = CHAT_EXPECT; */ c->argptr = &arg_term; } c->TimedOut = 0; } if (c->state != CHAT_EXPECT && c->state != CHAT_SEND) return 0; gottimeout = gotabort = 0; if (c->arg < c->argc && (c->arg < 0 || *c->argptr == '\0')) { /* Go get the next string */ if (c->arg < 0 || c->state == CHAT_SEND) c->state = CHAT_EXPECT; else c->state = CHAT_SEND; special = 1; while (special && (c->nargptr || c->arg < c->argc - 1)) { if (c->arg < 0 || (!TimedOut && c->state == CHAT_SEND)) c->nargptr = NULL; if (c->nargptr != NULL) { /* We're doing expect-send-expect.... */ c->argptr = c->nargptr; /* Put the '-' back in case we ever want to rerun our script */ c->nargptr[-1] = '-'; c->nargptr = chat_NextChar(c->nargptr, '-'); if (c->nargptr != NULL) *c->nargptr++ = '\0'; } else { int minus; if ((c->argptr = c->argv[++c->arg]) == NULL) { /* End of script - all ok */ c->state = CHAT_DONE; return 0; } if (c->state == CHAT_EXPECT) { /* Look for expect-send-expect sequence */ c->nargptr = c->argptr; minus = 0; while ((c->nargptr = chat_NextChar(c->nargptr, '-'))) { c->nargptr++; minus++; } if (minus % 2) log_Printf(LogWARN, "chat_UpdateSet: \"%s\": Uneven number of" " '-' chars, all ignored\n", c->argptr); else if (minus) { c->nargptr = chat_NextChar(c->argptr, '-'); *c->nargptr++ = '\0'; } } } /* * c->argptr now temporarily points into c->script (via c->argv) * If it's an expect-send-expect sequence, we've just got the correct * portion of that sequence. */ needcr = c->state == CHAT_SEND && (*c->argptr != '!' || c->argptr[1] == '!'); /* We leave room for a potential HDLC header in the target string */ ExpandString(c, c->argptr, c->exp + 2, sizeof c->exp - 2, needcr); /* * Now read our string. If it's not a special string, we unset * ``special'' to break out of the loop. */ if (gotabort) { if (c->abort.num < MAXABORTS) { int len, i; len = strlen(c->exp+2); for (i = 0; i < c->abort.num; i++) if (len > c->abort.string[i].len) { int last; for (last = c->abort.num; last > i; last--) { c->abort.string[last].data = c->abort.string[last-1].data; c->abort.string[last].len = c->abort.string[last-1].len; } break; } c->abort.string[i].len = len; if ((c->abort.string[i].data = (char *)malloc(len+1)) != NULL) { memcpy(c->abort.string[i].data, c->exp+2, len+1); c->abort.num++; } } else log_Printf(LogERROR, "chat_UpdateSet: too many abort strings\n"); gotabort = 0; } else if (gottimeout) { c->TimeoutSec = atoi(c->exp + 2); if (c->TimeoutSec <= 0) c->TimeoutSec = 30; gottimeout = 0; } else if (c->nargptr == NULL && !strcmp(c->exp+2, "ABORT")) gotabort = 1; else if (c->nargptr == NULL && !strcmp(c->exp+2, "TIMEOUT")) gottimeout = 1; else { if (c->exp[2] == '!' && c->exp[3] != '!') ExecStr(c->physical, c->exp + 3, c->exp + 3, sizeof c->exp - 3); if (c->exp[2] == '\0') { /* Empty string, reparse (this may be better as a `goto start') */ c->argptr = &arg_term; return chat_UpdateSet(d, r, w, e, n); } special = 0; } } if (special) { if (gottimeout) log_Printf(LogWARN, "chat_UpdateSet: TIMEOUT: Argument expected\n"); else if (gotabort) log_Printf(LogWARN, "chat_UpdateSet: ABORT: Argument expected\n"); /* End of script - all ok */ c->state = CHAT_DONE; return 0; } /* set c->argptr to point in the right place */ c->argptr = c->exp + (c->exp[2] == '!' ? 3 : 2); c->arglen = strlen(c->argptr); if (c->state == CHAT_EXPECT) { /* We must check to see if the string's already been found ! */ char *begin, *end; end = c->bufend - c->arglen + 1; if (end < c->bufstart) end = c->bufstart; for (begin = c->bufstart; begin < end; begin++) if (!strncmp(begin, c->argptr, c->arglen)) { c->bufstart = begin + c->arglen; c->argptr += c->arglen; c->arglen = 0; /* Continue - we've already read our expect string */ return chat_UpdateSet(d, r, w, e, n); } log_Printf(LogCHAT, "Expect(%d): %s\n", c->TimeoutSec, c->argptr); chat_SetTimeout(c); } } /* * We now have c->argptr pointing at what we want to expect/send and * c->state saying what we want to do... we now know what to put in * the fd_set :-) */ if (c->state == CHAT_EXPECT) return physical_doUpdateSet(&c->physical->desc, r, NULL, e, n, 1); else return physical_doUpdateSet(&c->physical->desc, NULL, w, e, n, 1); }