Skip to content

Commit 7f68181

Browse files
committed
Add README.md and update interfaces
1 parent 4b62182 commit 7f68181

17 files changed

+117
-24
lines changed

README.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# CS Demo Parser
2+
3+
CS Demo Parser is a Scala library for retrieving information from CS:GO .dem files.
4+
5+
## Usage
6+
CS Demo Parser exhibits interface to use it from Scala and Java.
7+
Java:
8+
```java
9+
//Obtain parser interface by call
10+
DemoParserInterface parser = DemoParsing.getParser();
11+
12+
//Parser API
13+
public interface DemoParserInterface {
14+
Future<DemoInterface> parseFromPath(Path path, ParserConfigInterface config, ExecutorService exService);
15+
Future<DemoInterface> parseFromInputStream(InputStream input, ParserConfigInterface config, ExecutorService exService);
16+
}
17+
//Future will throw DemoParsingException(String reason) on error
18+
19+
//For ParserConfigInterface you can use JavaParserConfig
20+
class JavaParserConfig {
21+
public JavaParserConfig(Set<String> _ignoredGameEvents);
22+
}
23+
```
24+
Scala:
25+
```scala
26+
//Use DemoParser companion object for parsing demos
27+
object DemoParser {
28+
def parseFromPath(path: Path, config: ParserConfigInterface)(implicit ec: ExecutionContext): Future[Either[String, Demo]]
29+
def parseFromInputStream(inputStream: InputStream, config: ParserConfigInterface)(implicit ec: ExecutionContext): Future[Either[String, Demo]]
30+
}
31+
//Instead of throwing exception it returns Either[String, Demo]
32+
33+
//Instead of interfaces you can use model implemented with case classes
34+
case class Demo(header: Header, events: Seq[GameEvent])
35+
case class Header(/*...*/)
36+
case class GameEvent(name: String, tick: Int, keys: Map[String, Value[_]])
37+
sealed trait Value[T]
38+
39+
//For config you can use ParserConfig case class
40+
case class ParserConfig(ignoredGameEvents: Set[String])
41+
```
42+
43+
Model classes also implement `PrettyPrintable` and `JsonSerializable` interfaces.
44+
45+
## Contributing
46+
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
47+
48+
Please make sure to update tests as appropriate.
49+
50+
## Credits
51+
Parsing algorithm used in this project was taken from [demofile](https://github.com/saul/demofile).
52+
53+
54+
## License
55+
[MIT](https://choosealicense.com/licenses/mit/)

src/main/java/DemoParsing.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package demoparser;
2+
3+
import demoparser.interfaces.DemoParserInterface;
4+
import demoparser.parser.DemoParser$;
5+
6+
public class DemoParsing {
7+
public static DemoParserInterface getParser() {
8+
return DemoParser$.MODULE$;
9+
}
10+
}

src/main/java/interfaces/DemoInterface.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import java.util.List;
66

7-
public interface DemoInterface {
7+
public interface DemoInterface extends PrettyPrintable, JsonSerializable {
88
HeaderInterface header();
99
List<GameEventInterface> eventsList();
1010
}

src/main/java/interfaces/GameEventInterface.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import java.util.Map;
66

7-
public interface GameEventInterface {
7+
public interface GameEventInterface extends PrettyPrintable, JsonSerializable {
88
String name();
99
int tick();
1010
Map<String, ValueInterface<?>> keysMap();

src/main/java/interfaces/HeaderInterface.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package demoparser.interfaces;
22

3-
public interface HeaderInterface {
3+
public interface HeaderInterface extends PrettyPrintable, JsonSerializable {
44
String magic();
55
int protocol();
66
int networkProtocol();
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package demoparser.interfaces;
2+
3+
public interface JsonSerializable {
4+
String toJson();
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package demoparser.interfaces;
2+
3+
public interface PrettyPrintable {
4+
String prettyPrint();
5+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package demoparser.interfaces;
22

3-
public interface ValueInterface<T> {
3+
public interface ValueInterface<T> extends PrettyPrintable, JsonSerializable {
44
public T v();
55
}

src/main/scala/Main.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package demoparser
33
import parser.DemoParser
44

55
import demoparser.config.ParserConfig
6-
import demoparser.serialization.JsonDemoSerializer
76

87
import java.io.{File, FileOutputStream, PrintStream}
98
import java.nio.file.{Files, Paths}
@@ -22,7 +21,7 @@ object Main extends App {
2221
val ps = new PrintStream(fileOS)
2322
val json =
2423
demo.map(
25-
_.fold(s => println(s), d => ps.print(JsonDemoSerializer.serialize(d)))
24+
_.fold(s => println(s), d => ps.print(d.toJson))
2625
)
2726
val eventStats = demo.map(
2827
_.map(

src/main/scala/model/Demo.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@ package demoparser
22
package model
33

44
import interfaces.{DemoInterface, GameEventInterface}
5+
6+
import demoparser.serialization.JsonDemoSerializer
7+
58
import scala.collection.JavaConverters._
69

7-
case class Demo(header: Header, events: Seq[GameEvent])
8-
extends PrettyPrintable
9-
with DemoInterface {
10+
case class Demo(header: Header, events: Seq[GameEvent]) extends DemoInterface {
1011
override def prettyPrint: String =
1112
header.prettyPrint + "\n" + events.map(_.prettyPrint).mkString("\n")
1213
override def eventsList(): java.util.List[GameEventInterface] = {
1314
val e: Seq[GameEventInterface] = events
1415
e.asJava
1516
}
17+
18+
override def toJson: String = {
19+
import io.circe.generic.auto._
20+
JsonDemoSerializer.serializeIfPossible(this)
21+
}
1622
}

0 commit comments

Comments
 (0)