Ptokax-Config

Aus Weimarnetz Wiki
Version vom 13. Juni 2007, 21:47 Uhr von MegaDave (Diskussion | Beiträge) („Ptokax-Config“ geschützt [edit=sysop:move=sysop])
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

wichtige Einstellungen

  • min.-max. share (freigabe)
  • min.-max. slots
  • IP-Adresse
  • Motd - Massage of the Day - Info beim verbinden
  • Webserver - Info fuer den Hub-betreiber


zusätzliche skripte (nuetzliches und spass usw.) in der Programmiersprache Lua 5.0.2.

Trivia Quiz-bot

-- Converted to Lua5 By Jelf 15/03/05
-- Translated by Psycho Chihuahua 16/03/05

BotName = "Quiz"
ScriptVersion = "WeimarnetzQuiz"
BotVersion = BotName.." "..ScriptVersion

-- This file is not needed it will be created if it not exists
strTrivScoreFile = "TriviaScores.dat"

-- This file is needed unless you want to run a Trivia with only two questions ;)
strDefTrivFile = "Trivia Fragen & Antworten.dat"
strTrivFile = strDefTrivFile
strQFile = "Trivia Fragen & Antworten selfmade.dat"

-- This char will be the global separator? (Make it one that is not used in nicknames nor questions ;)
strGSep = "*"

-- This char is used to mask the unrevealed chars
strCMask = "•"

-- Default startup mode of Trivia!
lngDefMode = 0 -- (0 = game is played in chat!, 1 = game is played in chat but questions only show for players, 2 = game is played in pm with players)
lngMode = lngDefMode

-- Max number of questions to show when a Operator ask to see list Questions 0 = 0, -1 = Disabled
lngMaxShowList = 5

-- Max no of Hints per word, and always hit on a hidden char
lngMaxHints = 4
boolHintAlwaysHitHidden = nil -- (nil = off, 1 = on)

-- How much time before a question end. Time in Trivia is measured in 15 seconds, 1 = 15 seconds, 2 = 30 seconds etc!
-- Rest is how long to rest after a question is solved depening on when the word is solved in the Timer loop it is 15 secs to the setting!
lngMaxTime = 8 -- (Needs to be a multiple of 4   i.e. 4 / 8 / 12 / 16)
lngRestTime = 2
lngHintTime = lngMaxTime / 4

-- How often should the bot autosave the scores
boolAutoSaveScores = 1 -- (nil = off, 1 = on)
countSaveTurns = 10 -- After how many questions should the scores be saved

-- Should bot reveal the correct answer once time is up?
boolRevealAnswer = 1 -- (nil = off, 1 = on)

-- Should the bot display what guess made the word become a little clearer if played in PM!
boolShowGuessesInPM = 1 -- (nil = off, 1 = on)

-- Should the bot Auto Reveal Hints?
boolAutoHint = 1 -- (nil = off, 1 = on)

-- Should the bot auto login every user on connect ?
boolAutoLogin = nil -- (nil = off, 1 = on)

-- Do you want users to be able to add questions ? Operators can always add questions.
boolAddQuestion = 1 -- (nil = No, 1 = Yes)

-- TriggStart is what char the commands should begin with I use ! but you can use # or whatever
TriggStart = "#"

-- Theese are the different triggers I've tried to name them so that one easily understand what they do!
-- I include TriggStart and then the word within "" this word is not casesensitive!
JoinTrigg = TriggStart.."qmitmach"
PartTrigg = TriggStart.."qraus"
StartTrigg = TriggStart.."qstart"
StopTrigg = TriggStart.."qstop"
WordTrigg = TriggStart.."qwort"
QuizTrigg = TriggStart.."qfrage"
RestartTrigg = TriggStart.."qneustart"
PointTrigg = TriggStart.."qpunkte"
ScoreTrigg = TriggStart.."qergebnis"
PlayerTrigg = TriggStart.."qspieler"
QuestionsTrigg = TriggStart.."qfragen"
ReloadTrigg = TriggStart.."qneuladen"
HelpTrigg = TriggStart.."qhilfe"
ExtraHelpTrigg = TriggStart.."qhilfe+"
SaveTrigg = TriggStart.."qsicherergebnis"
LoadTrigg = TriggStart.."qladeergebnis"
ModeTrigg = TriggStart.."qmodus"
HintTrigg = TriggStart.."qtip"
TopTrigg = TriggStart.."qtopten"
AddTrigg = TriggStart.."qfragedazu"

bcount = 0
scount = 0
sQuestion = ""
sAnswer = ""
guessArray = {}
lngGuessmax = 0
playerArray = {}
pointArray = {}
lngWord = 0
lngPassed = 0
lngHinted = 0
strWord = ""
strQuestion = ""
strSolved = ""
strBanner = "Schreibe '"..StartTrigg.."' um den Quizzbot zu starten, '"..StopTrigg.."' um den Quizzbot anzuhalten, '"..JoinTrigg.."' um am Quizz teilzunehmen und '"..PartTrigg.."' um das Quizz zu verlassen."
strStart = "Quizzbot "..ScriptVersion.." gestartet! "..strBanner
strStopp = "Quizzbot "..ScriptVersion.." angehalten! "..strBanner
----------------------
function Main()
	frmHub:RegBot(BotName)
	ReloadQuestions()
end
------------------------
function NewUserConnected(curUser)
	if (boolAutoLogin) then
		if (not (playerArray[curUser.sName])) then
			playerArray[curUser.sName] = 1
		else
			playerArray[curUser.sName] = nil
		end
	end
end
------------------------------
function OpConnected(curUser)
	if (boolAutoLogin) then
		if (not (playerArray[curUser.sName])) then
			playerArray[curUser.sName] = 1 
		else
			playerArray[curUser.sName] = nil
		end
	end
end
--------------------------------
function UserDisconnected(curUser)
	playerArray[curUser.sName] = nil
end
--------------------------------
function OpDisconnected(curUser)
	playerArray[curUser.sName] = nil
end
--------------------------------
function ChatArrival(curUser, data)
	data = string.sub(data, 1, (string.len(data) - 1))
	if ((lngMode == 0) or (lngMode == 1)) then
		boolPlaydata = 1
	end
	GotoTriggs(curUser, data)
end
----------------------------------
function ToArrival(curUser, data)
	data = string.sub(data, 1, (string.len(data) - 1))
	local _, _, whoTo = string.find(data,"$To:%s+(%S+)")
	if (whoTo == BotName) then
		data = string.sub(data, (15 + string.len(BotName) + string.len(curUser.sName)))
		if (lngMode == 2) then
			boolPlaydata = 1
			local _, _, chat = string.find(data, "%b<>%s(.+)")
			SendChatToOthers(chat, curUser)
		end
	end
	GotoTriggs(curUser, data)
end
-------------------------------------------
function GotoTriggs(curUser, data)
  local _, _, firstWord = string.find(data, "%b<>%s+(%S+)")
  
  if (firstWord ~= nil) then
    if ((string.lower(firstWord) == string.lower(HelpTrigg)) or (string.lower(firstWord) == string.lower(ExtraHelpTrigg))) then
      showHelp(curUser)
    elseif (string.lower(firstWord) == string.lower(SaveTrigg)) then
      if (curUser.bOperator) then
        SaveScores(curUser)
      end
    elseif (string.lower(firstWord) == string.lower(LoadTrigg)) then
      if (curUser.bOperator) then
        LoadScores(curUser)
      end
    elseif (string.lower(firstWord) == string.lower(TopTrigg)) then
	  TopTen(user)
    elseif (string.lower(firstWord) == string.lower(AddTrigg)) then
      if (boolAddQuestion) then
	s,e,sQuestion,sAnswer = string.find(data, "%b<>%s+%S+%s+(.+)#(.+)")	
	  AddQuestion(curUser,sQuestion,sAnswer)
      elseif (curUser.bOperator) then
      	s,e,sQuestion,sAnswer = string.find(data, "%b<>%s+%S+%s+(.+)#(.+)")	
	  AddQuestion(curUser,sQuestion,sAnswer)
      else
	  SendToPlayers("Fragen koennen jetzt nicht hinzugefuegt werden.")
      end
    elseif (string.lower(firstWord) == string.lower(ModeTrigg)) then
      if (curUser.bOperator) then
        local _, _, ModeDigit = string.find(data, "%b<>%s+%S+%s+(%d+)")
        if (ModeDigit ~= nil) then
          lngMode = tonumber(ModeDigit)
          if (lngMode == 0) then
            SendToPlayers("Quizz wird im Mainchat gespielt")
          elseif (lngMode == 1) then
            SendToPlayers("Quizz wird im Mainchat gespielt aber Fragen koennen nur Quizzer sehen")
          elseif (lngMode == 2) then
            SendToPlayers("Quizz wird ueber PM gespielt")
          else
            SendToPlayers("Falscher Modus gewaehlt, wurde auf Voreinstellung gesetzt")
            lngMode = lngDefMode
          end
        end
      end
    elseif (string.lower(firstWord) == string.lower(JoinTrigg)) then
      if (not (playerArray[curUser.sName])) then
        playerArray[curUser.sName] = 1
        SendToPlayers(curUser.sName.." ist jetzt mit dabei!")
      else curUser:SendPM(BotName, "Du bist schon Mitspieler. Es kann sein das Du automatisch eingeloggt wurdest.")
      end
    elseif (string.lower(firstWord) == string.lower(PartTrigg)) then
      if (playerArray[curUser.sName]) then
        SendToPlayers(curUser.sName.." ist nicht länger Mitspieler!")
        playerArray[curUser.sName] = nil
      end
    elseif (string.lower(firstWord) == string.lower(RestartTrigg)) then
      if (curUser.bOperator) then
        SendToPlayers("Quizzbot neugestartet. Alle Punkte sind nun weg!")
        SendToPlayers("Wenn Du jetzt speicherst wird der alte Punktestand überschrieben!")
        pointArray = {}
        StopQuiz(1)
      end
    elseif ((string.lower(firstWord) == string.lower(PointTrigg)) and (playerArray[curUser.sName])) then
      if (pointArray[curUser.sName]) then
        SendToPlayers(curUser.sName.." Du hast "..pointArray[curUser.sName].." Punkte!")
      else
        SendToPlayers(curUser.sName.." Du hast 0 Punkte!")
      end
    elseif ((string.lower(firstWord) == string.lower(HintTrigg)) and (playerArray[curUser.sName])) then
      if ((lngWord ~= 0) and string.find(strSolved, strCMask, 1, plain)) then
        if (lngHinted < lngMaxHints) then
  	  for nn=1,bcount do
              local lngRepChar = math.random(1, string.len(strWord))
              while 1 do
                if (boolHintAlwaysHitHidden) then
                  if (strsub(strSolved, lngRepChar, lngRepChar) == strCMask) then
                    break
                  end
                else
                  break
                end
                lngRepChar = math.random(1, string.len(strWord))
              end
              local strTurn = ""
              for x=1, string.len(strWord) do
                if (x == lngRepChar) then
                 strTurn = strTurn..string.sub(strWord, x, x)
                else
                  strTurn = strTurn..string.sub(strSolved, x, x)
                end
	      end
              strSolved = strTurn
	  end
            lngHinted = lngHinted + 1
	    lngHintTimeCount = lngHintTimeCount + lngHintTime
            SendToPlayers("Hinweis: "..strSolved)
	    acount = ""
         else
            SendToPlayers("Alle Hinweise aufgebraucht!")
       end
      else
        SendToPlayers("Kein Hinweis gebraucht!")
      end
    elseif ((string.lower(firstWord) == string.lower(ScoreTrigg)) and (playerArray[curUser.sName])) then
      curUser:SendPM(BotName, "ERGEBNISSE:")
      curUser:SendPM(BotName, "---------------------------------------------------------")
      for index, value in pointArray do
        curUser:SendPM(BotName, index.."'s punkte: "..value)
      end
      curUser:SendPM(BotName, "---------------------------------------------------------")
    elseif ((string.lower(firstWord) == string.lower(PlayerTrigg)) and (playerArray[curUser.sName])) then
      curUser:SendPM(BotName, "SPIELER:")
      curUser:SendPM(BotName, "---------------------------------------------------------")
      for index, value in playerArray do
        curUser:SendPM(BotName, index)
      end
      curUser:SendPM(BotName, "---------------------------------------------------------")
    elseif (string.lower(firstWord) == string.lower(QuestionsTrigg)) then
      if (curUser.bOperator) then
        curUser:SendPM(BotName, "TOP "..lngMaxShowList.." FRAGEN:")
        curUser:SendPM(BotName, "---------------------------------------------------------")
        local lngShowMax = lngMaxShowList
        for index, value in guessArray do
          if (lngShowMax == 0) then
            break
          end
          arrTmp = tokenize(guessArray[index], strGSep)
          strTmp = arrTmp[1]
          curUser:SendPM(BotName, "["..index.."] "..strTmp)
          lngShowMax = lngShowMax - 1
        end
        curUser:SendPM(BotName, "Total # an Fragen: "..lngGuessmax)
        curUser:SendPM(BotName, "---------------------------------------------------------")
        curUser:SendPM(BotName, " ")
      end
    elseif (string.lower(firstWord) == string.lower(StartTrigg)) then
      if (curUser.sName) then
        if (lngWord == 0) then
          playerArray[curUser.sName] = 1
          SendToAll(BotName, strStart)
          if (lngMode == 2) then
            SendToPlayers(strStart)
          end
          StopQuiz(1)
        else
          SendToAll(BotName, "Da ist ein Quizz im gange, schreibe "..JoinTrigg.." um mitzuspielen!")
        end
      else
	curUser:SendPM(BotName, "Nur Op's koennen das Quizz starten.")
      end
    elseif (string.lower(firstWord) == string.lower(StopTrigg)) then
      if (curUser.sName) then
        HoldQuiz()
        StopQuiz()
        SendToAll(BotName, strStopp)
        if (lngMode == 2) then
          SendToPlayers(strStopp)
        end
      end
    elseif (string.lower(firstWord) == string.lower(WordTrigg)) then
      if ((lngWord ~= 0) and (playerArray[curUser.sName] == "Player")) then
        SendToPlayers("Die derzeitige Frage lautet: "..strSolved.." ("..strlen(strSolved)..")")
      end
    elseif (string.lower(firstWord) == string.lower(QuizTrigg)) then
      if ((lngWord ~= 0) and (playerArray[curUser.sName])) then
        SendToPlayers("Frage: "..strQuestion)
      end
    elseif (string.lower(firstWord) == string.lower(ReloadTrigg)) then
      if (curUser.bOperator) then
        local _, _, secondWord = string.find(data, "%b<>%s+%S+%s+(%S+)")
        if (secondWord) then
        handle = io.open(secondWord, "r")
          if (handle) then
            handle:close()
            strTrivFile = secondWord
          end
        end
        
        HoldQuiz()
        ReloadQuestions()
      end
    else
	if ((lngWord ~= 0) and (boolPlaydata)) then
        if (playerArray[curUser.sName]) then
          local msg = string.sub(data, (4 + string.len(curUser.sName)))
          if (string.len(msg) >= string.len(strWord)) then
            local boolDisc = nil
            
	local strTurn = "" 
		  if string.lower(msg) == string.lower(strWord) then 
		    strTurn = strWord
		    boolDisc = 1 
		  else 
		    strTurn = strSolved
		  end 
 
            
            if (boolDisc) then
              strSolved = strTurn
            end
            if (boolDisc) then
              if (string.lower(msg) ~= string.lower(strWord)) then
                SendToOthers(curUser, msg)
                SendToPlayers("Die Antwort ist nun: "..strSolved)
              end
            end
            if (string.lower(msg) == string.lower(strWord)) then
              if (not (pointArray[curUser.sName])) then
                pointArray[curUser.sName] = 0
              end
		if lngHinted == 3 then pointArray[curUser.sName] = pointArray[curUser.sName] + 1
		elseif lngHinted == 2 then pointArray[curUser.sName] = pointArray[curUser.sName] + 2
		elseif lngHinted == 1 then pointArray[curUser.sName] = pointArray[curUser.sName] + 3
		else pointArray[curUser.sName] = pointArray[curUser.sName] + 4
		end 
              SendToPlayers("Die Antwort war: "..strSolved)
              SendToPlayers("Die Antwort wurde erraten von: "..curUser.sName)
              SendToPlayers("Naechste Frage in "..(lngRestTime * 15).." (15) Secs")
              lngPassed = lngMaxTime
              SendToPlayers(curUser.sName.."'s Punkte: "..pointArray[curUser.sName])
              HoldQuiz()
            end
          end
        end
      end
    end
  end
end
--------------------------------
function HoldQuiz()
  strWord = ""
  strQuestion = ""
  strSolved = ""
end

function StopQuiz(restart)
  lngWord = 0
  lngPassed = 0
  strWord = ""
  strQuestion = ""
  strSolved = ""
  StopTimer()
  if (restart) then
    StartQuiz()
  end
end

function StartQuiz()
  lngWord = math.random(1, lngGuessmax)
  QWarray = tokenize(guessArray[lngWord], strGSep)
  strQuestion = QWarray[1]
  strWord = QWarray[2]
  strSolved = ""
  for x=1, string.len(strWord) do
    if (string.sub(strWord, x, x) == " ") then
      strSolved = strSolved.." "
    else
      strSolved = strSolved..strCMask
    end
  end
  lngPassed = 0
  lngHinted = 0
  lngHintTimeCount = lngHintTime
  if string.len(strWord) < 4 then
	bcount = math.random(1, 2)
  elseif string.len(strWord) >= 4 and string.len(strWord) <= 9 then
	bcount = math.random(1, 3)
  elseif string.len(strWord) >= 9 and string.len(strWord) <= 20 then
	bcount = math.random(2, 4)
  else
	bcount = math.random(3, 5)
  end
  SetTimer(15000)
  StartTimer()
  SendToPlayers("Frage: "..strQuestion)
  SendToPlayers("Antwort: "..strSolved.." ("..string.len(strSolved)..")")
end
-----------------------------------------
function OnTimer()
  lngPassed = lngPassed + 1
  if (lngPassed == lngMaxTime) then
    scount = scount + 1
    if scount == countSaveTurns then
	   local handle = io.open(strTrivScoreFile, "w")
	    	for index, value in pointArray do
   	   	handle:write(index..strGSep..value.."\r\n")
 	   end
   	   handle:close()
    scount = 0
    end
    if (boolRevealAnswer) then
      SendToPlayers("Die Antwort war '"..strWord.."' und wurde nicht erraten!")
    else
      SendToPlayers("Die Antwort wurde nicht erraten!")
    end
    SendToPlayers("Naechste Frage in "..(lngRestTime * 15).." Sekunden")
    HoldQuiz()
  elseif (lngPassed >= (lngRestTime + lngMaxTime)) then
    StopQuiz(1)
  elseif (lngPassed == lngHintTimeCount) then
    if (boolAutoHint) then
	for nn=1,bcount do
            local lngRepChar = math.random(1, string.len(strWord))
            while 1 do
              if (boolHintAlwaysHitHidden) then
                if (string.sub(strSolved, lngRepChar, lngRepChar) == strCMask) then
                  break
                end
              else
                break
              end
              lngRepChar = math.random(1, string.len(strWord))
            end
            local strTurn = ""
            for x=1, string.len(strWord) do
              if (x == lngRepChar) then
               strTurn = strTurn..string.sub(strWord, x, x)
              else
                strTurn = strTurn..string.sub(strSolved, x, x)
              end
	    end
            strSolved = strTurn
	end
            lngHinted = lngHinted + 1
	    lngHintTimeCount = lngHintTimeCount + lngHintTime
            SendToPlayers("Hinweis: "..strSolved)
	end  
  end
end
---------------------------------------
function tokenize (inString,token)
  _WORDS = {}
  local matcher = "([^"..token.."]+)"
  string.gsub(inString, matcher, function (w) table.insert(_WORDS,w) end)
  return _WORDS
end
----------------------------------------
function ReloadQuestions()
  guessArray = {}
  lngGuessmax = 0
  local boolRestart = nil
  if (lngWord ~= 0) then
    SendToPlayers("Lade Fragen neu, Quizz wird beendet!")
    StopQuiz()
    boolRestart = 1
  end
  handle = io.open(strTrivFile, "r")
  if (handle) then
    local line = handle:read()
    
    while line do
      if ((line ~= "") and (string.find(line, strGSep, 1, plain))) then
        table.insert(guessArray, line)
        lngGuessmax = lngGuessmax + 1
      end
      line = handle:read()
    end
  handle:close()
  end
  if (lngGuessmax < 1) then
  guessArray = {
    "Wie nennt man ein Boomerang der nicht zurückkommt?"..strGSep.."ein Stock",
    "Wie heisst das Rundling-Dorf in der nähe von Weimar?"..strGSep.."Tiefengruben",
    "Welcher deutsche Kaiser starb in Memmleben?"..strGSep.."Otto der Erste",
    "Welches ist das meistgebaute Auto der Welt?"..strGSep.."VW Kaefer",
    "An welchem Wochentag ist meistens das Weimarnetztreffen?"..strGSep.."Dienstag",
    "Wieviel Aldi Filialen gibt es in Weimar?"..strGSep.."3",
    "Wie heisst der Konstrukteur des VW Käfer?"..strGSep.."Ferdinand Porsche",
    "In welcher Stadt ist das grösste Freifunknetz?"..strGSep.."Berlin"
  }
  lngGuessmax = 2
  end
  if (boolRestart) then
    SendToPlayers("Lade Fragen neu, Quizz wird neugestartet! Derzeitige Anzahl der Fragen: "..lngGuessmax)
    StartQuiz()
  end
  strTrivFile = strDefTrivFile
end
----------------------------------------
function SaveScores(curUser)
  local handle = io.open(strTrivScoreFile, "w")
  for index, value in pointArray do
    handle:write(index..strGSep..value.."\r\n")
  end
  curUser:SendData(BotName,"Punktestand gesichert")
  handle:close()
end
-----------------------------------------
function LoadScores(curUser)
	local handle = io.open(strTrivScoreFile, "r")
	if (handle) then
		local line = handle:read()
		while line do
			local arrTmp = tokenize(line, strGSep)
			if ((arrTmp[1] ~= nil) and (arrTmp[2] ~= nil)) then
				pointArray[arrTmp[1]] = tonumber(arrTmp[2])
			end
			line = handle:read()
		end
	curUser:SendData(BotName,"Punktestand geladen")
	handle:close()
	end
end
---------------------------------------------------
function AddQuestion(curUser, sQuestion, sAnswer)
  local handle = io.open(strQFile, "a")
  handle:write("Vorgeschlagen von <"..curUser.sName.."> "..sQuestion..strGSep..sAnswer.."\r\n")
  SendToPlayers(curUser.sName.." hat eine Frage hinzufefuegt "..sQuestion)
  curUser:SendPM(BotName,curUser.sName.." Du gabst als Antwort "..sAnswer)
  handle:close()
end
--------------------------------------------
function SendToPlayers(msg)
  if ((lngMode > 2) or (lngMode < 0)) then
    lngMode = lngDefMode
  end
  
  if (lngMode == 0) then
    SendToAll(BotName, msg)
  elseif (lngMode == 1) then
    for index, value in playerArray do
      SendToNick(index, "<"..BotName.."> "..msg)
    end
  elseif (lngMode == 2) then
    for index, value in playerArray do
      SendPmToNick(index, BotName, msg)
    end
  end
end
---------------------------------------------
function SendToOthers(msg, curUser)
  if ((lngMode == 2) and (boolShowGuessesInPM)) then
    for index, value in playerArray do
      if (index ~= curUser.sName) then
        SendPmToNick(index, BotName, "<"..curUser.sName.."> "..msg)
      end
    end
  end
end
-----------------------------------------------
function SendChatToOthers(chat, curUser)
  if (lngMode == 2) then
    for index, value in playerArray do
      if (index ~= curUser.sName) then
	SendToNick(index, "$To: "..index.." From: "..BotName.." $<"..curUser.sName.."> "..chat)
      end
    end
  end
end
--------------------------------------------
function showHelp(curUser)
  curUser:SendData("<Help> ")
  curUser:SendData("<Help> "..BotVersion.." Befehle:")
  curUser:SendData("<Help> ")
  if (lngMode == 0) then
    curUser:SendData("<Help>    "..BotVersion.." spielt das Quizz nun im Mainchat")
  elseif (lngMode == 1) then
    curUser:SendData("<Help>    "..BotVersion.." spielt das Quizz nun versteckt im Mainchat")
  else
    curUser:SendData("<Help>    "..BotVersion.." spielt das Quizz nun als PM")
  end
  curUser:SendData("<Help>    "..HelpTrigg.." - Zeigt diese Hilfe")
  curUser:SendData("<Help>    "..JoinTrigg.." - damit kannst Du am Quizz teilnehmen")
  curUser:SendData("<Help>    "..PartTrigg.." - damit verlaesst Du das Quizz")
  curUser:SendData("<Help>    "..WordTrigg.." - zeigt das derzeitig gesuchte Wort (Antwort)")
  curUser:SendData("<Help>    "..QuizTrigg.." - zeigt die derzeitige Frage")
  curUser:SendData("<Help>    "..PointTrigg.." - zeigt Deine Punkte")
  curUser:SendData("<Help>    "..ScoreTrigg.." - zeigt die Ergebnisse von allen")
  curUser:SendData("<Help>    "..PlayerTrigg.." - zeigt alle Spieler die am derzeitigen Quizz teilnehmen")
  curUser:SendData("<Help>    "..HintTrigg.." - enthuellt einen Buchstaben in der derzeitigen Antwort")
  curUser:SendData("<Help>    "..TopTrigg.." - zeigt die Top Ten Ergebnisse")
  curUser:SendData("<Help>    "..AddTrigg.." - fuegt ein Frage zum Fragenfile hinzu. Schreibe die Frage und trenne die Antwort von der Frage mit einer #")
  curUser:SendData("<Help>    BEISPIEL : qfrage Wie schnell fliegt ein Vogel?#keine Ahnung")
  if (curUser.bOperator) then
    curUser:SendData("<Help> ")
    curUser:SendData("<Help>    "..BotVersion.." Operator Befehle:")
    curUser:SendData("<Help>    "..StopTrigg.." - Stoppt den Quizzbot")
    curUser:SendData("<Help>    "..RestartTrigg.." - startet den Quizzbot neu, alle Ergebnisse werden zurueckgesetzt!")
    curUser:SendData("<Help>    "..QuestionsTrigg.." - zeigt alle Fragen im derzeitigen Quizz")
    curUser:SendData("<Help>    "..ReloadTrigg.." (<filename>) - laedt die Fragen von "..strDefTrivFile)
    curUser:SendData("<Help>    "..ModeTrigg.." - aendert den Spielmodus (0-2)!")
    curUser:SendData("<Help>    "..SaveTrigg.." - speichert die Ergebnisse in "..strTrivScoreFile)
    curUser:SendData("<Help>    "..LoadTrigg.." - laedt die Ergebnisse von "..strTrivScoreFile)
    curUser:SendData("<Help>    "..StartTrigg.." - startet den Quizzbot und Du nimmst automatisch daran teil")
    curUser:SendData("<Help> ")
    curUser:SendData("<Help>    "..BotVersion.." Modis:")
    curUser:SendData("<Help>    ".."0 = gespielt wird im Mainchat!")
    curUser:SendData("<Help>    ".."1 = gespielt wird im Mainchat aber die Fragen sind nur sichtbar fuer Mitspieler")
    curUser:SendData("<Help>    ".."2 = gespielt wird komplett als PM")
  end
end
----------------------------------------------
function TopTen(user)
	local index = {n=0}
	table.foreach(pointArray, function(nick, score) table.insert(index, nick) end)
	local func = function(a, b) return pointArray[a] > pointArray[b] end
	table.sort(index, func)

	x = x or 10 if x > index.n then x = index.n end
	local result = "\r\nTop "..x.." Quizz Ergebnisse in diesem Hub..\r\n Pos\t Score\t\t Nick\t\r\n"
	for i = 1, x do result = result.."\r\n "..i..".\t"..pointArray[index[i]].."\t\t"..index[i] end
	msg = result
	SendToPlayers(msg)
end


Postman(mailserver)-bot

-- PostMan Bot 0.3 by bastya_elvtars (the rock n' roll doctor)
-- offline message system
-- code ripped from law maker bot
-- comands can be PMed or typed in main, the bot responds to them according to the environment (sometimes at least :D)
-- the commands are case insensitive, the parameters aren't :)

------- 0.2:
-- added function so ppl cannot post 2 online users

------- 0.3:
-- converted to lua5
-- washere is now global, no more CPU spikes

------- 0.4:
-- touched by Herodes (optimisation tsunami)
-- added : more details on the bot
-- added : message privacy ;)
-- changed : better way to parseenv ;)
-- changed : better way to display messages and inbox
-- changed : better way to parsecmds ( thx bastya_elvtars ;)

------- 0.5:
-- touched by Skippy84
-- fix error: make offline.dat thx goto Herodes for the idea to fix the problem
-- fix error: false command !showmsg
-- added: commands can edit at the Settings section
-- added: shown commands linked to the editable commands (so ther change on the fly)

------- 0.51:
-- bastya_elvtars put his hands back on this
-- script now creates an empty offline.dat if does not exist... you guys keep ignoring new Lua5 features :P
-- thx guys for the features you added, they are really eye-candy

------- 0.6:
-- touched again by Skippy84
-- added: a little rightclick menu

--------------------------------SETTINGS----------------------------------------

Bot = {
       name = "Weimarnetz-Mailserver" , -- bot's name
       email = "postman@mail.me", -- bot's email
       desc = "Nachrichten senden an User die gerade nicht da sind..", -- bot's desc
      }

inboxsize=15 -- the maximum amount of messages users can have in their inbox

cmdpost = "postmsg" -- Shows the Hub Stats
cmdread = "readmsg" -- Shows the Hub Stats
cmdibox = "inbox" -- Shows the Hub Stats
cmddbox = "delmsg" -- Shows the Hub Stats

----------------------END OF SETTINGS-------------------------------------------


-------------------------------------- Utility Functions

function cls()
   collectgarbage()
   io.flush()
end

function Main()
  local function load()
  local t = {}; local f = io.open("washere.lst", "r")
  if f then for l in f:lines() do t[l] = 1; end; f:close(); end
    return t;
  end
    washere = load()
    message = {}
	if loadfile("offline.dat") then
		dofile("offline.dat")
	else
		io.output("offline.dat")
		io.write("")
		io.output()
	end
    frmHub:RegBot(Bot.name, 1, Bot.desc, Bot.email )
    Bot = Bot.name
end

-------------------------------------- Command Functions

--- post msg

function postmsg( user, data, how )
  local _,_,nick,msg = string.find(data,"%b<>%s+%S+%s+(%S+)%s+(.*)")
  if nick then
    if not GetItemByName(nick) then
       if washere[nick] then
         local function checksize(n) local cnt = 0; for a,b in message[n] do cnt = cnt + 1; end return cnt; end
          if not message[nick] then message[nick] = {}; end
             if (checksize(nick) < inboxsize) then
                table.insert( message[nick], { ["message"] = msg, ["who"] = user.sName, ["when"] = os.date("%Y. %m. %d. %X"), ["read"] = 0, } )
                SendBack( user, "Erfolgreich gesendete Nachricht!", Bot, how )
                savemsg()
             else
                SendBack( user, "Sorry, aber "..nick.." hat eine volle Mailbox. Probier es später.", Bot, how )
             end
          else
             SendBack( user, "User "..nick.." wart nie gesehen in diesem Hub.", Bot, how )
          end
       else
          SendBack( user, nick.." ist online! PM ist doch einfacher...", Bot, how )
       end
    else
       SendBack( user, "Falscher syntax! Schreibe: !"..cmdpost.."  ", Bot, how )
    end
  cls(); return 1;
end

--- del msg

function delmsg( user, data, how )
  if message[user.sName] then
    local _,_,args = string.find(data,"%b<>%s+%S+%s+(.+)")
    if args then
      local function checksize(n) local cnt = 0; for a,b in message[n] do cnt = cnt + 1; end return cnt; end
      local function resort(t) local r ={}; for i,v in t do table.insert(r, v); end; return r; end
      for num in string.gfind( args, "%s-(%d+)%s-" ) do
      if num then
        num = tonumber(num);
          if message[user.sName][num] then
            message[user.sName][num] = nil
            SendBack( user, "Nachricht #"..num.." erfolgreich gelöscht!", Bot, how )
          else
            SendBack( user, "Nachricht #"..num.." existiert nicht!", Bot, how )
          end
      end
    end
    message[user.sName] = resort(message[user.sName]);
    if checksize(user.sName) == 0 then message[user.sName] = nil; end
      savemsg()
    else
      SendBack( user, "Falscher syntax! Schreibe: !"..cmddbox.." . Mehrere Zahlen mit Leerzeichen trennen.", Bot, how )
    end
  else
    SendBack( user, "Deine Mailbox ist leer.", Bot, how )
  end
    cls(); return 1;
end

----------------------------------------------------------------------------------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------- show inbox

function inbox( user, how )
  local sep, msg = string.rep( "=", 75 ), "\r\n\r\n\t\t\t\t\t\t\tHere is your inbox:\r\n"
  msg = msg..sep.."\r\n Msg#\tSender\tTime of sending\t\tRead\r\n"..sep
  if message[user.sName] then
    local function numess ( r ) if r == 0 then return "no"; end return "yes"; end
    local function checksize ( n ) local cnt = 0; for a,b in message[n] do cnt = cnt + 1; end return cnt; end
    local function dcode ( s ) if (string.sub(s,1,3) == "-n#") then s=string.sub(s,4,-1); local res = ""; for num in string.gfind( s, "#?(%d+)") do res = res..string.char(tonumber(num));end;return res;end;return s;end
    for num, t in message[user.sName] do
    msg=msg.."\r\n "..num.."\t"..dcode(t.who).."\t"..t.when.."\t"..numess(t.read).."\r\n"..sep
  end
    SendBack( user, msg, Bot, true )
    SendBack( user, "Schreibe !"..cmdread.."  um die Nachricht zu sehen. Mehrere Zahlen mit Leerzeichen trennen.", Bot, true )
  if checksize(user.sName) >= inboxsize then SendBack( user, "Alarm: Deine Mailbox ist voll!", Bot, true ); end
  else
    SendBack( user, "Du hast keine Nachrichten.", Bot, how )
  end
  cls(); return 1;
end

--- read msg(s)

function readmsg( user, data, how )
  if message[user.sName] then
    local _,_,args=string.find(data,"%b<>%s+%S+%s+(.+)")
    if args then
      local function dcode(s) if (string.sub(s,1,3) == "-n#") then s = string.sub(s,4,-1);local res = ""; for num in string.gfind( s, "#?(%d+)") do res = res..string.char(tonumber(num));end;return res;end;return s;
    end
    for num in string.gfind( args, "%s-(%d+)%s-" ) do
      if num then num = tonumber(num) end
      if num and message[user.sName][num] then
        local t = message[user.sName][num]
        local msg, sep,set = "\r\n\r\n\t\t\t\t\t\t\tMessage #"..num.."\r\n", string.rep( "=", 100 ), string.rep("- ", 85)
        msg = msg..sep.."\r\n\r\nFrom: "..dcode(t.who).."\tTime: "..t.when.."\t\tMessage follows\r\n"..set.."[Message start]\r\n"..dcode(t.message).."\r\n"..set.."[Message end]\r\n"..sep
        SendBack( user, msg, Bot, true )
        if t.read == 0 then t.read = 1; savemsg(); end
      else
         SendBack( user, "Nachricht #"..num.." existiert nicht!", Bot, how )
      end
   end
  else
    SendBack( user, "Falscher syntax! Schreibe: !"..cmdread.." . Mehrere Zahlen mit Leerzeichen trennen.", Bot, how )
  end
  else
    SendBack( user, "Deine Mailbox ist leer.", Bot, how )
  end
  cls(); return 1;
end

--- save msg

function savemsg()
  local function parse(tbl)
  local str, tab ="", string.rep( "\t", 9)
  local function fquot(s) return string.format( "%q", s) end
  local function ncode( s ) if (s ~= "") and (string.sub(s,1,3) ~= "-n#") then local t = {}; for i = 1, string.len(s) do t[i] = string.byte(string.sub(s,i,i)); end; return "-n#"..table.concat(t, "#"); end; return s; end
  for a, t in tbl do
    str = str.."\t\t{ ["..fquot("read").."] = "..t.read..", ["..fquot("who").."] = "..fquot(ncode(t.who))..", ["..fquot("when").."] = "..fquot(t.when)..",\n\t\t["..fquot("message").."] = "..fquot(ncode(t.message)).." },\n"
  end
  return str
  end
  local f = io.open ( "offline.dat", "w+" )
  local s = "message = {"
  for name, t in message do
   s = s.."\n\t["..string.format( "%q", string.gsub( name, "\"", "\"")).."] = {\n"..parse(t).."\t},"
  end;
   f:write(s.."\n}")
   f:close()
   end

function SendBack( user, msg, who, pm )
   if pm then user:SendPM ( who, msg ); else user:SendData( who, msg ); end
end

function NewUserConnected(user)
	if user.bUserCommand then
		user:SendData("$UserCommand 1 3 :Weimarnetz-Mailserver:\\INBOX$<%[mynick]> !inbox||")
		user:SendData("$UserCommand 1 3 :Weimarnetz-Mailserver:\\poste eine Nachricht$<%[mynick]> !postmsg %[line:Enter  and :]||")
		user:SendData("$UserCommand 1 3 :Weimarnetz-Mailserver:\\lese eine Nachricht$<%[mynick]> !readmsg %[line:Enter Nr of Post you would read:]||")
		user:SendData("$UserCommand 1 3 :Weimarnetz-Mailserver:\\lösche eine Nachricht$<%[mynick]> !delmsg %[line:Enter Nr of Post you would delete:]||")
		user:SendData(":Weimarnetz-Mailserver:", "Neues Rechts-Click Menu für Weimarnetz-Mailserver steht zur Verfügung..")
	end
	
  if not washere[user.sName] then washere[user.sName] = 1 end
  if message[user.sName] then
  local cnt=0
  for a,b in message[user.sName] do if (b.read == 0) then cnt = cnt+1; end end
  if (cnt > 0) then SendBack( user, "Du hast "..cnt.." neue Nachrichten. Schreibe !"..cmdibox.." um in Deine Mailbox zu schauen!", Bot, true ); end
  end
end

function ChatArrival(user,data)
  local data = string.sub( data, 1, -2 )
  local _,_,cmd = string.find(data,"%b<>%s+[!+.#?](%S+)")
  if cmd then return parsecmds( user, data, string.lower(cmd) ); end
end

function ToArrival(user,data)
  if (string.sub( data, 1, string.len(Bot)+5) == "$To: "..Bot) then
   local data = string.sub( data, 1, -2 )
   local _,_,cmd = string.find(data,"%$%b<>%s+[!+.#?](%S+)")
   if cmd then return parsecmds( user, data, string.lower(cmd), true ) end
    return 1
  end
end

function parsecmds( user, data, cmd, how )
  local t = {
    [cmdpost] = { postmsg, { user, data, how } },
    [cmdread] = { readmsg, { user, data, how } },
    [cmdibox] = { inbox, { user, how } },
    [cmddbox] = { delmsg, { user, data, how } },
    }
  if t[cmd] then
    return t[cmd][1]( unpack(t[cmd][2]) )
  end
end

function UserDisconnected(user)
  if not washere[user.sName] then washere[user.sName] = 1; end
end

function OnExit()
  savemsg()
  local f = io.open( "washere.lst", "w+")
  for a,b in washere do f:write(a.."\n"); end
  f:close()
end

OpDisconnected=UserDisconnected
OpConnected=NewUserConnected

Voting(VotePoll-bot)

--Vote Poll v1.0
--Made by nErBoS 
--Converted to Lua 5 by jiten
--Changed Visual Design / Translated to german / Added Rightclick by pulsar

Bot = "Vote Poll" 

vt = {} 
nr = {} 

votetext = "voting.txt"
oldpolls = "voting-old.txt"

function Main()
	frmHub:RegBot(Bot)
end 

function NewUserConnected(user, data) 
	if (vt[user.sName] == nil) then 
		vt[user.sName] = 0
	end
	if (nr[user.sName] == nil) then
		nr[user.sName] = 0
	end

end

function NewUserConnected(user,data)
	UserCmds(user)
	if user.bOperator then
	OpCmds(user)
	end
end

OpConnected = NewUserConnected
rcmenue = "Voting"

function UserCmds(user)             -- User Befehle
        user:SendData("$UserCommand 1 3 "..rcmenue.."\\Zeige aktuelle Umfragen$<%[mynick]> +votefor||")
	user:SendData("$UserCommand 1 3 "..rcmenue.."\\Zeige beendete Umfragen$<%[mynick]> +votelist||")
	user:SendData("$UserCommand 0 3 |") 							-- separator
	user:SendData("$UserCommand 1 3 "..rcmenue.."\\Bei einer aktuellen Umfrage abstimmen$<%[mynick]> +vote %[line:Welche Zuordnungsnummer?] %[line:y / n ?  (Yes or No)]||")
	user:SendData("$UserCommand 0 3 |") 							-- separator
	user:SendData("$UserCommand 1 3 "..rcmenue.."\\Abstimmungsergebnisse\\PM\\aktuelle Umfragen$<%[mynick]> +showvote %[line:Welche Zuordnungsnummer?] new||")
        user:SendData("$UserCommand 1 3 "..rcmenue.."\\Abstimmungsergebnisse\\PM\\beendete Umfragen$<%[mynick]> +showvote %[line:Welche Zuordnungsnummer?] old||")
	user:SendData("$UserCommand 1 3 "..rcmenue.."\\Abstimmungsergebnisse\\Main\\aktuelle Umfragen$<%[mynick]> +svmain %[line:Welche Zuordnungsnummer?] new||")
	user:SendData("$UserCommand 1 3 "..rcmenue.."\\Abstimmungsergebnisse\\Main\\beendete Umfragen$<%[mynick]> +svmain %[line:Welche Zuordnungsnummer?] old||")
	end
function OpCmds(user)               -- OP Befehle
-- leer
	if (user.iProfile == 0) then        -- Master Befehle
		user:SendData("$UserCommand 1 3 "..rcmenue.."\\Admin\\Umfrage erstellen$<%[mynick]> +createvote %[line:Welche Zuordnungsnummer?] %[line:Welche Umfrage?]||")
		user:SendData("$UserCommand 1 3 "..rcmenue.."\\Admin\\Umfrage beenden$<%[mynick]> +stopvote %[line:Welche Zuordnungsnummer?]||")
		user:SendData("$UserCommand 1 3 "..rcmenue.."\\Admin\\Umfrage löschen$<%[mynick]> +delvote %[line:Welche Zuordnungsnummer?]||")
	end
end

function ChatArrival(user, data)
	data=string.sub(data,1,string.len(data)-1)
	s,e,cmd = string.find(data,"%b<>%s+(%S+)")
	if (cmd=="+votehelp") then
		local msg = ""
		if (user.iProfile == 0) then
			msg = msg.."Befehle für das Voting:\r\n"
			msg = msg.."\r\n"
			msg = msg.."+createvote <nr> <q>\tErstellt eine Umfrage (nr = Zuordnungsnummer für die Umfrage) (q = Umfrage)\r\n"
			msg = msg.."+stopvote <nr>\t\tBeendet die Umfrage\r\n"
			msg = msg.."+showvote <nr> <old/new>\tZeigt die Abstimmungsergebnisse der Umfrage (old = alte Umfragen) oder (new = Umfragen die noch nicht beendet worden sind)\r\n"
			msg = msg.."+svmain <nr> <old/new>\tZeigt die Abstimmungsergebnisse im Main (old = alte Umfragen) oder (new = Umfragen die noch nicht beendet worden sind)\r\n"
			msg = msg.."+votelist\t\t\tZeigt alle Umfragen\r\n"
			msg = msg.."+votefor\t\t\tZeigt die Umfragen bei denen du abstimmen kannst\r\n"
			msg = msg.."+vote <nr> <y/n>\t\tUm bei einer Umfrage abzustimmen (y = ja) (n = nein) (nr = Nummer der Umfrage)\r\n"
			msg = msg.."+delvote <nr>\t\tUm alte Umfragen zu löschen (nr = Nummer der zu löschenden Umfrage)\r\n"
			msg = msg.."\r\n"
			user:SendPM(Bot, msg)
		else 
			msg = msg.."Befehle für das Voting:\r\n"
			msg = msg.."\r\n"
			msg = msg.."+votefor\t\t\tZeigt die Umfragen bei denen du abstimmen kannst\r\n" 
			msg = msg.."+vote <nr> <y/n>\t\tUm bei einer Umfrage abzustimmen (y = ja) (n = nein) (nr = Nummer der Umfrage)\r\n"
			msg = msg.."\r\n"
			user:SendPM(Bot, msg)
		end 
		return 1
	elseif (cmd=="+createvote") then
		if (user.iProfile == 0) then
			local s,e,number,question = string.find(data,"%b<>%s+%S+%s+(%S+)%s+(.*)")
			if (tonumber(number) == nil) then
				user:SendPM(Bot, "Syntax error, +createvote <nr> <q>, nr muss eine Nummer sein!")
			else
				number = tonumber(number)
			        if (question == nil or question == "") then
					user:SendPM(Bot, "Syntax error, +createvote <nr> <q>, du musst schon auch ne Frage erstellen worüber abgestimmt werden soll!")
				else
				         if (CreatePoll(user, number, question) == 1) then
						user:SendPM(Bot, "Die Abstimmung bzw. Umfrage wurde erstellt.") 
					else
						user:SendPM(Bot, "Es existiert bereits eine Abstimmung bzw. Umfrage mit der Nummer  "..number..".")
					end
				end
			end
		else
			user:SendPM(Bot, "Du hast keine Befugnis diesen Befehl zu nutzen!")
		end
		return 1
	elseif (cmd=="+stopvote") then
		if (user.iProfile == 0) then
			local s,e,number = string.find(data,"%b<>%s+%S+%s+(.*)")
			if (tonumber(number) == nil or number == "") then
				user:SendPM(Bot, "Syntax error, +stopvote <nr>, nr muss eine Nummer sein!")
			else
				number = tonumber(number)
				if (OldPoll(user, number) == 1) then
					user:SendPM(Bot, "Die Abstimmung bzw. Umfrage wurde beendet und gespeichert in der  "..oldpolls..".")
			else 
					user:SendPM(Bot, "Es gibt keine Abstimmung bzw. Umfrage mit der Nummer  "..number..".")
				end
			end
		else
			user:SendPM(Bot, "Du hast keine Befugnis diesen Befehl zu nutzen!")
		end
		return 1
	elseif (cmd=="+showvote") then
		if (user.iProfile == 0) then
			local s,e,number, opt = string.find(data,"%b<>%s+%S+%s+(%S+)%s+(%S+)")
			if (tonumber(number) == nil) then
				user:SendPM(Bot, "Syntax error, +showvote <nr> <old/new>, nr muss eine Nummer sein!")
			else
				number = tonumber(number)
				if (opt == "old") then
					if (CheckPoll(user, number, oldpolls) == "") then
						user:SendPM(Bot, "Es gibt keine beendete Umfrage mit der Nummer  "..number..".")
					else
						user:SendPM(Bot, CheckPoll(user, number, oldpolls))
					end
				elseif(opt == "new") then
					if (CheckPoll(user, number, votetext) == "") then
						user:SendPM(Bot, "Es gibt keine Umfrage mit der Nummer  "..number..".")
					else
						user:SendPM(Bot, CheckPoll(user, number, votetext)) 
					end
				else
					user:SendPM(Bot, "Syntax error, +showvote <nr> <old/new>, muss sein (old = alte Umfragen) oder (new = Umfragen die noch nicht beendet worden sind)")
				end
			end
		else
			user:SendPM(Bot, "Du hast keine Befugnis diesen Befehl zu nutzen!")
		end
		return 1 
	elseif (cmd=="+svmain") then
		if (user.iProfile == 0) then
			local s,e,number, opt = string.find(data,"%b<>%s+%S+%s+(%S+)%s+(%S+)")
			if (tonumber(number) == nil) then
				user:SendPM(Bot, "Syntax error, +svmain <nr> <old/new>, nr muss eine Nummer sein!") 
			else
				number = tonumber(number)
				if (opt == "old") then
					if (CheckPoll(user, number, oldpolls) == "") then
						user:SendPM(Bot, "Es gibt keine beendete Umfrage mit der Nummer  "..number..".")
					else
						SendToAll(Bot, CheckPoll(user, number, oldpolls))
					end
				elseif(opt == "new") then
					if (CheckPoll(user, number, votetext) == "") then
						user:SendPM(Bot, "Es gibt keine Umfrage mit der Nummer  "..number..".")

	         			else
						SendToAll(Bot, CheckPoll(user, number, votetext))
					end
				else
					user:SendPM(Bot, "Syntax error, +svmain <nr> <old/new>, muss sein (old = alte Umfragen) oder (new = Umfragen die noch nicht beendet worden sind)")
				end
			end
		else
			user:SendPM(Bot, "Du hast keine Befugnis diesen Befehl zu nutzen!")
		end
		return 1
	elseif (cmd=="+votelist") then
		if (user.iProfile == 0) then
			local l = io.open(oldpolls, "r")
			if (ReadPoll(user, oldpolls) == "") then
				user:SendPM(Bot, "Es gibt keine beendeten Umfragen")
			else
				user:SendPM(Bot, ReadPoll(user, oldpolls))
			end
		else
			user:SendPM(Bot, "Du hast keine Befugnis diesen Befehl zu nutzen!")
		end
		return 1
	elseif (cmd=="+votefor") then
		if (ReadPoll(user, votetext) == "") then
			user:SendPM(Bot, "Es gibt keine Abstimmungen bzw. Umfragen")
		else
			user:SendPM(Bot, ReadPoll(user, votetext))
		end
		return 1
	elseif (cmd=="+vote") then
		local s,e,number,opt = string.find(data,"%b<>%s+%S+%s+(%S+)%s+(%S+)")
		if (tonumber(number) == nil) then
			user:SendPM(Bot, "Syntax error, +vote <nr> <y/n>, nr muss eine Nummer sein!")
		else
			number = tonumber(number)
			if (opt == nil or opt == "" or opt ~= "n" and opt ~= "y") then
				user:SendPM(Bot, "Syntax error, +vote <nr> <y/n>, du musst schreiben (y = ja) oder (n = nein).")
		else
					if (Vote(user, number, opt) == 1) then
				user:SendPM(Bot, "Deine Abstimmung wurde registriert.")
					vt[user.sName] = 1
					nr[user.sName] = number
				elseif(Vote(user, number, opt) == 2) then
				user:SendPM(Bot, "Du hast bei dieser Umfrage bereits abgestimmt")
				else
					user:SendPM(Bot, "Es gibt keine Umfrage mit der Nummer  "..number..".")
				end
		end
		end 
		return 1 
	elseif (cmd=="+delvote") then
		if (user.iProfile == 0) then
			local s,e,number = string.find(data,"%b<>%s+%S+%s+(%S+)")
			if (tonumber(number) == nil) then
				user:SendPM(Bot, "Syntax error, +delvote <nr>, nr muss eine Nummer sein!")
			else
				number = tonumber(number)
				if (DelOldPoll(user, number) == 0) then
					user:SendPM(Bot, "Es gibt keine beendete Umfrage mit der Nummer  "..number)
				else
					user:SendPM(Bot, "Die alte Umfrage wurde gelöscht.")
				end
			end
		else
			user:SendPM(Bot, "Du hast keine Befugnis diesen Befehl zu nutzen!")
		end
		return 1
	end
end

ToArrival = ChatArrival 

function CreatePoll(user, number, question) 
	local tmp = "" 
	local time = 0
	local a = io.open(oldpolls, "r")
	if a then
		while 1 do
			local line = a:read()
			if (line == nil) then
				break
			else
				local s,e,num = string.find(line,"Nr:%s+(%S+)%s+")
				if (tonumber(num) ~= nil and tonumber(num) == number) then
					time = 2
				else
				end
			end
		end
		a:close()
	else
		dofile(oldpolls)
--		return a.." doesnt exist"
	end

	local b = io.open(votetext,"r")
	if b then
		while 1 do
			local line = b:read()
			if (line == nil) then
				if (time == 2) then
					break
				else
					tmp = tmp.."Nr: "..number.." Umfrage: "..question.." Ja: 0 Nein: 0 Active: Ja\r\n"
					time = 1
					break
				end
			else
				local s,e,num = string.find(line,"Nr:%s+(%S+)%s+")
				if (tonumber(num) ~= nil and tonumber(num) == number) then
					tmp = tmp..line.."\r\n"
					time = 2
				else
					tmp = tmp..line.."\r\n"
				end
			end
		end

		b:close()
		local l = io.open(votetext,"w+")
		l:write(tmp)
		l:flush()
		l:close()
		return time 
	else
		dofile(votetext)
--		return b.." doesnt exist"
	end
	return time
end

function OldPoll(user, number) 
	local tmp = "" 
	local tmp2 = "" 
	local time = 0
	local c = io.open(votetext,"r")
	if c then
		while 1 do
			local line = c:read()
			if (line == nil) then
				break
			else
				local s,e, num, question, ny, nn = string.find(line,"Nr:%s+(%S+)%s+(.*)Ja:%s+(%S+)%s+Nein:%s+(%S+)%s+Active:")
				if (tonumber(num) ~= nil and tonumber(num) == number) then
					tmp2 = tmp2.."Nr: "..number.." "..question.."Ja: "..ny.." Nein: "..nn.." Active: Nein\r\n"
					time = 1
				else
					tmp = tmp..line.."\r\n"
				end
			end
		end
		c:close()
		local d = io.open(votetext,"w+")
		d:write(tmp)
		d:flush()
		d:close()
		if (time == 0) then 
		else
			local e = io.open(oldpolls, "a+") -- "a+"
			e:write(tmp2)
			e:close()
		end
		return time
	else
		dofile(votetext)
--		return c.." existiert nicht"

	end
end

function CheckPoll(user, number, file)
	local tmp = ""
	local f = io.open(file,"r")
	if f then
		while 1 do
			local line = f:read()
			if (line == nil) then
				break
			else
				local s,e, num, question, ny, nn = string.find(line,"Nr:%s+(%S+)%s+(.*)Ja:%s+(%S+)%s+Nein:%s+(%S+)%s+Active:")
				if (tonumber(num) ~= nil and tonumber(num) == number) then
					tmp = tmp.."\r\n________________________________________________" 
					tmp = tmp.."\r\n------------------------------------------ Voting ------------------------------------------"
					tmp = tmp.."\r\n¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\r\n\r\n"
					tmp = tmp.."Ergebnis von Umfrage Nr:  "..num.." "
					tmp = tmp.."\r\n¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\r\n\r\n"
					tmp = tmp..""..question.."\r\n"
					tmp = tmp.."------------------------------\r\n"
					tmp = tmp.."Ja:     "..ny.."\r\n"
					tmp = tmp.."Nein: "..nn.."\r\n"
					tmp = tmp.."------------------------------\r\n"
					if (tonumber(ny) > tonumber(nn)) then
						tmp = tmp.."Ja liegt vorne"
					elseif (tonumber(ny) < tonumber(nn)) then
						tmp = tmp.."Nein hat gewonnen."
					elseif (tonumber(ny) == tonumber(nn)) then
					tmp = tmp.."unentschieden."
					end
					break 
				else
				end
			end
		end
		f:close()
		return tmp
	else
		dofile(file)
--		return f.." existiert nicht"
	end
end

function ReadPoll(user, file) 
	local tmp = "" 
	local g = io.open(file,"r")
	if g then
		while 1 do 
			local line = g:read() 
			if (line == nil or line == "") then 
              			break 
			else 
				local s,e, num, question, ny, nn = string.find(line,"Nr:%s+(%S+)%s+(.*)Ja:%s+(%S+)%s+Nein:%s+(%S+)%s+Active:") 
				if (num == nil) then 
				else 
					tmp = tmp.."\r\n________________________________________________" 
					tmp = tmp.."\r\n------------------------------------------ Voting ------------------------------------------" 
					tmp = tmp.."\r\n¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\r\n\r\n" 
					tmp = tmp.."Ergebnis von Umfrage Nr:  "..num.." " 
					tmp = tmp.."\r\n¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\r\n\r\n"
					tmp = tmp..""..question.."\r\n" 
					tmp = tmp.."------------------------------\r\n" 
					tmp = tmp.."Ja:     "..ny.."\r\n" 
					tmp = tmp.."Nein: "..nn.."\r\n" 
					tmp = tmp.."------------------------------\r\n" 
					if (file == oldpolls) then 
						tmp = tmp.."Umfrage beendet\r\n" 
					elseif (file == votetext) then 
						tmp = tmp.."Umfrage läuft noch\r\n" 
					end 
				end 
			end 
		end 
		g:close()
		return tmp 
	else 
		dofile(file) 
--		return g.." existiert nicht"
	end
end 

function Vote(user, number, opt) 
	local tmp = "" 
	local time = 0 
	if (vt[user.sName] == 1 and nr[user.sName] == number) then 
		time = 2 
	else 

		local h = io.open(votetext,"r")
		if h then
			while 1 do 
				local line = h:read() 
				if (line == nil) then 
					break 
				else 
					local s,e, num, question, ny, nn = string.find(line,"Nr:%s+(%S+)%s+(.*)Ja:%s+(%S+)%s+Nein:%s+(%S+)%s+Active:") 
					if (tonumber(num) ~= nil and tonumber(num) == number) then 
						if (opt == "y") then 
							ny = tonumber(ny) + 1 
						elseif (opt == "n") then 
							nn = tonumber(nn) + 1 
						end 
						tmp = tmp.."Nr: "..number.." "..question.."Ja: "..ny.." Nein: "..nn.." Active: Ja\r\n" 
						time = 1 
					else 
						tmp = tmp..line.."\r\n" 
					end 
				end 
			end 
			h:close()
		else 
			dofile(votetext) 
--		return h.." existiert nicht"
		end
		local i = io.open(votetext,"w+")
		i:write(tmp)
		i:flush()
		i:close()
	end 
	return time 
end 

function DelOldPoll(user, number) 
	local tmp = "" 
	local time = 0 
	local j = io.open(oldpolls,"r")
	if j then
		while 1 do 
			local line = j:read() 
			if (line == nil) then 
				break 
			else 
				local s,e, num, question, ny, nn = string.find(line,"Nr:%s+(%S+)%s+(.*)Ja:%s+(%S+)%s+Nein:%s+(%S+)%s+Active:") 
				if (tonumber(num) ~= nil and tonumber(num) == number) then 
					time = 1 
				else 
					tmp = tmp..line.."\r\n" 
				end 
			end 
		end 
		j:close()
	else 
	        dofile(oldpolls) 
--		return j.." existiert nicht"
	end
	local k = io.open(oldpolls,"w+")
	k:write(tmp)
	k:flush()
	k:close()
	return time 
end