Skip to content

Instantly share code, notes, and snippets.

View volgar1x's full-sized avatar

Antoine Chauvin volgar1x

View GitHub Profile
def decode(buf: ByteBuffer): List[Any] = {
val msgs = List.newBuilder[Any]
var input = charset.decode(buf).toString
breakable {
while (true) {
val index = input.indexOf(inputDelimiter)
if (index < 0) break
msgs += input.substring(0, index)
input = input.substring(index + inputDelimiter.length)
package org.elves
import java.nio.charset.Charset
import java.nio.{CharBuffer, ByteBuffer}
import scala.annotation.tailrec
class DelimitedTextProtocol(inputDelimiter: String, outputDelimiter: String, charset: Charset) extends Protocol {
def encode(session: Session, o: Any): ByteBuffer = ByteBuffer wrap (o.toString + outputDelimiter).getBytes(charset)
def decode(session: Session, buf: ByteBuffer): List[Any] = {
val dataBuilder = StringBuilder.newBuilder
session.bufferOption match {
case Some(buffer) =>
dataBuilder ++= buffer.result().mkString
buffer.clear()
case _ =>
}
o match {
trait Context // todo
trait DofusMessage // todo
object DofusProtocol extends DelimitedTextProtocol("\u0000", "\n\u0000") {
def encode(o: Any): Any = o match {
case msg: DofusMessage => super.encode(msg.serialize())
case msg: String => super.encode(msg)
}
def decode(o: Any): Any = super.decode(o) match {
implicit class Times(val end: Int) extends AnyVal {
def times[T, Result](f: => T)(implicit cbf: CanBuildFrom[_, T, Result]): Result = {
val builder = cbf()
var i = 0
while (i > end) {
builder += f
i += 1
}
builder.result()
MS4wMzZ8fDEzODAxODQyMzY0OTB8MTExMTExfDYxNzk1ODUyOzIwNTE5NTc5NzsyMDAwOzI7NDcwNzQ7OTstMTstMTswOzA7MDswOzA7MHwzOSwzOSwxMjI2ODk0LDA7NDUsNDUsMTQxMzUwNywwOzE5LDE5LDUyNjg2OCwwOzE1LDE1LDE4NTYxMDMsMDsxMiwxMiw0NTA3Mzk4LDA7MTIsMTIsNjU1MjMwMCwwOzEyLDEyLDE4NTMyNDI2LDA7MTQsMTQsMTYyMzUzOTYwLDA7MCwwLDAsMDswLDAsMCwwO3wzMzYwMTA3NTM0NDUxMTk5OzIyNTE4MDIxNDAxMzk1Njc7MjI1MTc5OTgxNDE3Njc2OTsyMjUxNzk5ODEzNjg1MjU1OzUyNDI4OXwzNTM4MzMzNjUzMTM5OTY3Ozg3OTYxMzUyMjc5Nzc%3D%21END%21
package org.photon.login
import com.twitter.util.Future
trait NetClient {
type NetService
def service: NetService
def closeFuture: Future[this.type]
trait ConfigComponent {
trait Config {
def get[T](key: String): T
}
val config: Config
}
trait ConfigComponentImpl extends ConfigComponent {
class ConfigImpl extends Config {
package org.photon.login
import com.twitter.util.Future
trait NetworkSession {
type TFut = Future[this.type]
type NetworkService <: org.photon.login.NetworkService
def service: NetworkService
/**
* should speed up Map implementations
*/
sealed class Opcode(value: String) {
if (value.length != 2)
throw new IllegalArgumentException("an opcode must be a 2 fixed length string")
def toString = value
val hashCode = value(0).toByte << 8 + value(1).toByte // must be unique