Archief - Probleem met code C#

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

azertyalex

Legacy Member
Dag, volgende code werkt als whitelist voor een DayZ server.
http://banana.nu/dayz_whitelist1.zip
Dit is een stuk code die zou moten werken als whitelist voor een DayZ server.
Alles werkt naar behoren behalve dat het programma twee tekstbestandjes zou moeten maken; genaamd added.txt en whitelist.txt, dit doet hij niet. Ik zie het probleem wel niet. Kunnen jullie mij helpen?

alvast bedankt :)

Fraggie

Legacy Member
Die host reageert niet a.t.m.?
Kan je de code op pastebin.com zetten?

deathsythe

Legacy Member
re-uploaded,
Zippyshare.com - dayz_whitelist1.zip

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

using BattleNET;

namespace dayz_whitelist
{
    class Program
    {

        static IBattleNET BEClient;

        static bool isConnected = false;

        static long lastMessageRecieved;

        static void Main(string[] args)
        {
            DateTime currTime = DateTime.Now;
            lastMessageRecieved = currTime.Ticks;

            Console.WriteLine("DayZ Banana whitelist service.");

            String host = "83.233.199.18";
            int port = 2302;
            String password = "PASSWORDHERE";

            BattlEyeLoginCredentials loginCredentials = new BattlEyeLoginCredentials(host, port, password);

            BEClient = new BattlEyeClient(loginCredentials);

            BEClient.MessageReceivedEvent += HandleMessage;

            BEClient.DisconnectEvent += HandleDisconnect;

            BEClient.ReconnectOnPacketLoss(false);


            while (true)
            {
                isConnected = false;

                Console.WriteLine("Connecting to " + host + " on port " + port + ".");

                EBattlEyeConnectionResult connection = BEClient.Connect();

                    
                System.Threading.Thread.Sleep(1000);

                if (isConnected)
                {


                    Console.WriteLine("Connection successful.");


                    while (isConnected)
                    {
                        System.Threading.Thread.Sleep(3000);
                        BEClient.SendCommandPacket(EBattlEyeCommand.Players);

                        currTime = DateTime.Now;
                        if (currTime.Ticks - lastMessageRecieved > 100000000)
                        {
                            isConnected = false;
                            Console.WriteLine("No message recieved for 10 seconds. Disconnecting.");
                        }
                    }

                }
                else
                {
                    Console.WriteLine("Could not connect. Retrying in 5 seconds.");
                }

                    
                BEClient.Disconnect();

                System.Threading.Thread.Sleep(5000);
                    


            }


        }

        private static void HandleMessage(BattlEyeMessageEventArgs args)
        {

            DateTime currTime = DateTime.Now;

            lastMessageRecieved = currTime.Ticks;

            String message = args.Message;

            String loginPattern = "^RCon";
            Match whitelistMatch = Regex.Match(message, loginPattern);
            if (whitelistMatch.Success)
            {
                isConnected = true;
            }

            String sPattern = "^Player #([\\d]{1,2}) (.+?) - GUID: (\\w{1,32})";


            Match playerConnectedMatch = Regex.Match(message, sPattern);
            if (playerConnectedMatch.Success)
            {
                Console.WriteLine("Player " + playerConnectedMatch.Groups[2].Value + " connected");
                if (!IsWhitelisted(playerConnectedMatch.Groups[2].Value, playerConnectedMatch.Groups[3].Value))
                {
                    Console.WriteLine("Player " + playerConnectedMatch.Groups[2].Value + " is not whitelisted. Kicking.");
                    BEClient.SendCommandPacket(EBattlEyeCommand.Kick, playerConnectedMatch.Groups[1].Value + "Not Whitelisted");
                }
                else
                {
                    Console.WriteLine("Player " + playerConnectedMatch.Groups[2].Value + " is whitelisted.");
                }
            }

        }

        static void HandleDisconnect(BattlEyeDisconnectEventArgs args)
        {
            isConnected = false;
        }

        static bool IsWhitelisted(String Player, String GUID)
        {
            TextReader tr;

            try
            {
                tr = new StreamReader("whitelist.txt");
            }
            catch (Exception e)
            {
                TextWriter tw = new StreamWriter("whitelist.txt");
                tw.Close();
                tr = new StreamReader("whitelist.txt");
            }

            while(tr.Peek() != -1){
                String guidRow = tr.ReadLine();
                if (GUID == guidRow)
                {
                    tr.Close();
                    return true;
                }
            }
            tr.Close();

            if (AddToWhitelist(Player, GUID))
            {
                return true;
            }

            return false;
        }

        static bool AddToWhitelist(String Player, String GUID)
        {
            TextReader tr;
            TextWriter tw;

            try
            {
                tr = new StreamReader("added.txt");
            }
            catch (Exception e)
            {
                tw = new StreamWriter("added.txt");
                tw.Close();
                tr = new StreamReader("added.txt");
            }

            while (tr.Peek() != -1)
            {
                String player = tr.ReadLine();


                if (Player == player)
                {
                    tr.Close();

                    RemoveFromAdded(player);

                    tw = new StreamWriter("whitelist.txt", true);
                    tw.WriteLine(GUID);
                    tw.Close();
                    return true;
                }
            }

            tr.Close();

            return false;
        }

        static void RemoveFromAdded(String playerName)
        {
            TextReader tr = new StreamReader("added.txt");

            String tempFile = Path.GetTempFileName();
            TextWriter tempw = new StreamWriter(tempFile);

            while (tr.Peek() != -1)
            {
                String playerRow = tr.ReadLine();
                if (playerRow != playerName)
                {
                    tempw.WriteLine(playerRow);
                }
            }
            tempw.Close();
            tr.Close();

            File.Delete("added.txt");
            File.Move(tempFile, "added.txt");

            Console.WriteLine("Player " + playerName + " was added to whitelist");

        }
    }
}

http://pastebin.com/sYf8mEFr

Fraggie

Legacy Member
Zonder ook maar iets te debuggen, zit je toch met een aantal ontwerp fouten, vermoed ik.
bv: AddToWhitelist(..)
Code:
try
{
    tr = new StreamReader("added.txt");
}
catch (Exception e)
{

    tw = new StreamWriter("added.txt");
    tw.Close();
    tr = new StreamReader("added.txt");
}
Dit kan een stuk efficiënter.

Code:
if (Player == player)
Lijkt me iets voor The Daily WTF: Curious Perversions in Information Technology (m.a.w. niet alleen betere variable names, maar ook consistent zijn met de case)

Ook het overlappen van die StreamReader en StreamWriter maakt je code minder goed leesbaar. In AddToWhitelist(..) is het een simpele StreamReader(..) in RemoveFromAdded(..), IsWhitelisted(..) en AddToWhitelist(..) een TextReader.

Waarom is ook alles static?


Dit klikt allemaal negatief, maar je hebt nu een programma dat bijna volledig werkt. Moest je nu opnieuw beginnen met de kennis die je opgedaan hebt en de kleine puntjes dat ik aanhaal, zal je misschien al rapper zien waar het probleem zit. Je kan dan ook eens denken aan een mini state-machine. Als het programma opstart controleert hij als al de bestanden gemaakt zijn.. als de host up is.. en dan pas begint hij die server af te scannen.

h0us3cat

Legacy Member
Fraggie zei:
Zonder ook maar iets te debuggen, zit je toch met een aantal ontwerp fouten, vermoed ik.
bv: AddToWhitelist(..)
Code:
try
{
    tr = new StreamReader("added.txt");
}
catch (Exception e)
{

    tw = new StreamWriter("added.txt");
    tw.Close();
    tr = new StreamReader("added.txt");
}
Dit kan een stuk efficiënter.

Code:
if (Player == player)
Lijkt me iets voor The Daily WTF: Curious Perversions in Information Technology (m.a.w. niet alleen betere variable names, maar ook consistent zijn met de case)

Ook het overlappen van die StreamReader en StreamWriter maakt je code minder goed leesbaar. In AddToWhitelist(..) is het een simpele StreamReader(..) in RemoveFromAdded(..), IsWhitelisted(..) en AddToWhitelist(..) een TextReader.

Waarom is ook alles static?


Dit klikt allemaal negatief, maar je hebt nu een programma dat bijna volledig werkt. Moest je nu opnieuw beginnen met de kennis die je opgedaan hebt en de kleine puntjes dat ik aanhaal, zal je misschien al rapper zien waar het probleem zit. Je kan dan ook eens denken aan een mini state-machine. Als het programma opstart controleert hij als al de bestanden gemaakt zijn.. als de host up is.. en dan pas begint hij die server af te scannen.

Is niet van hem zelf, maar van een random persoon on the internetz die er iets heeft geprobeerd. Voor deze persoon werkt het wel, het probleem bij ons is dat added.txt en whitelist.txt niet aangemaakt worden en als we deze dan zelf aanmaken en in de root zetten ziet die tool deze niet.

azertyalex

Legacy Member
h0us3cat zei:
Is niet van hem zelf, maar van een random persoon on the internetz die er iets heeft geprobeerd. Voor deze persoon werkt het wel, het probleem bij ons is dat added.txt en whitelist.txt niet aangemaakt worden en als we deze dan zelf aanmaken en in de root zetten ziet die tool deze niet.

dat is wat ik heb uitgelegd. kinda :p
maar kun je nu met deze uitleg het probleem oplossen?

MegaMentor

Legacy Member
h0us3cat zei:
Is niet van hem zelf, maar van een random persoon on the internetz die er iets heeft geprobeerd. Voor deze persoon werkt het wel, het probleem bij ons is dat added.txt en whitelist.txt niet aangemaakt worden en als we deze dan zelf aanmaken en in de root zetten ziet die tool deze niet.

Even aanhalen nog dat we toestemming hebben van de maker om het te gebruiken en editten en hebben reeds aan hem gevraagd of hij wist wat het probleem was maar kon daar geen antwoord op geven.

Carry on.

Fraggie

Legacy Member
Ik wil er wel naar kijken, maar om tijd te winnen zou ik toch die rcon password nodig hebben. Is het mogelijk deze tijdelijk aan te passen naar iets random? Of iemand die een test server kan opzetten?

Anders moet ik gokken wat er moet veranderd worden en moeten jullie dat testen.. dat zal veel heen en weer zend werk zijn. Atm ben ik online op IRC.

edit:
Grotendeels herschreven, maar niet getest:
http://pastebin.com/ESwfaduz

Prior

Legacy Member
Ik zou wel willen helpen maar heb geen BF3 om te checken of het werkt.

Eigenlijk staat daar al een code dat spelers identificeert en toevoegt aan een whitelist maar dan enkel in een console.

Ik zou daar binnenin gewoon enkele methodes voorzien om een zo'n .txt file aan te maken.

Maar om die bestandjes dan te vinden, moet je dan geen relatief pad bijsluiten??? zoals:

@"\..\..\added.txt" of @"(full path server en specifiek map toewijzen)\whitelist.txt"

private static void HandleMessage(BattlEyeMessageEventArgs args)
{

DateTime currTime = DateTime.Now;

lastMessageRecieved = currTime.Ticks;

String message = args.Message;

String loginPattern = "^RCon";
Match whitelistMatch = Regex.Match(message, loginPattern);
if (whitelistMatch.Success)
{
isConnected = true;
}

String sPattern = "^Player #([\\d]{1,2}) (.+?) - GUID: (\\w{1,32})";


Match playerConnectedMatch = Regex.Match(message, sPattern);
if (playerConnectedMatch.Success)
{
Console.WriteLine("Player " + playerConnectedMatch.Groups[2].Value + " connected");
if (!IsWhitelisted(playerConnectedMatch.Groups[2].Value, playerConnectedMatch.Groups[3].Value))
{
Console.WriteLine("Player " + playerConnectedMatch.Groups[2].Value + " is not whitelisted. Kicking.");
BEClient.SendCommandPacket(EBattlEyeCommand.Kick, playerConnectedMatch.Groups[1].Value + "Not Whitelisted");

// kicking? methode à la "Add player to blacklist.txt" als hij/zij nog niet aanwezig is in lijst
}
else
{
Console.WriteLine("Player " + playerConnectedMatch.Groups[2].Value + " is whitelisted.");

// methode toevoegen à la "Add player to whitelist.txt" als hij/zij nog niet aanwezig is in lijst
}
}

}

h0us3cat

Legacy Member
Fraggie zei:
Ik wil er wel naar kijken, maar om tijd te winnen zou ik toch die rcon password nodig hebben. Is het mogelijk deze tijdelijk aan te passen naar iets random? Of iemand die een test server kan opzetten?

Anders moet ik gokken wat er moet veranderd worden en moeten jullie dat testen.. dat zal veel heen en weer zend werk zijn. Atm ben ik online op IRC.

edit:
Grotendeels herschreven, maar niet getest:
[C#] using System; using System.Collections.Generic; using System.Linq; using Syst - Pastebin.com

Zal morgen is testen, werken binnen 10 min.
Als het nie werkt zulde pm krijgen.

update: nope zelfde probleem de .txt's worden niet aangemaakt of gevonden als ik deze zelf maak.

Tyfius

Legacy Member
@Fraggie: er zit nog ergens een bug.

Code:
// Open the whitelist.txt file for reading
string whitelistPlayer;
using (TextReader reader = File.OpenText(FILE_NAME_ADDED))
{
    [B][COLOR="Red"]while ((whitelistPlayer = reader.ReadLine()) != null)[/COLOR][/B]
    {
        if (Player == whitelistPlayer)
        {
            playerIsFound = true;
        }
    }
}

// Add him to the whitelist.txt
if (playerIsFound)
{
    [B][COLOR="Red"]RemoveFromAdded(whitelistPlayer);[/COLOR][/B]
    using (TextWriter streamWriter = new StreamWriter(FILE_NAME_WHITELIST, APPEND))
    {
        streamWriter.WriteLine(GUID);
    }
    returnValue = true;
}

Het verwijderen kan nooit lukken, want whitelistPlayer gaat altijd null zijn.

Fraggie

Legacy Member
Tyfius zei:
@Fraggie: er zit nog ergens een bug.

..

Het verwijderen kan nooit lukken, want whitelistPlayer gaat altijd null zijn.
Klopt, ik heb die twee stukken willen scheiden van elkaar: zoeken en deleten, and now it screws me over. Verder wou ik ook absoluut de parameter "Player" niet meer hergebruiken. Nuja, patch:

Code:
-                RemoveFromAdded(whitelistPlayer);
+                RemoveFromAdded(Player);

h0us3cat

Legacy Member
Iemand een idee hoe het kan komen dat het werkt als er gecompiled wordt met visual studio en niet met visual c# express?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan