aboutsummaryrefslogblamecommitdiff
path: root/shared/Message.scala
blob: bc76fae738b7ee9bc0aaa4c94da00d53c55875f2 (plain) (tree)
1
2
3
4
5
6
7
8
9
10




                                  




                                      















                                                                   


                                                                 














                                                       
package triad

import java.security.MessageDigest
import java.time.Instant

case class Message(
    content: String,
    author: String,
    timestamp: Instant = Instant.now()
) {

  lazy val id: String = {
    val digest = MessageDigest.getInstance("SHA-256")
    digest.update(content.getBytes)
    digest.update(author.getBytes)
    digest.update((timestamp.getEpochSecond & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 8) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 16) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 24) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 32) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 40) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 48) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 56) & 0xff).toByte)
    Message.bytesToHex(digest.digest())
  }

  def hashTags: Seq[String] =
    content.split("\\s").filter(_.startsWith("#")).map(_.drop(1))

}

object Message {
  private def bytesToHex(hash: Array[Byte]): String = {
    val hexString = new StringBuffer(hash.length * 2)
    var i = 0
    while (i < hash.length) {
      val hex = Integer.toHexString(0xff & hash(i))
      if (hex.length == 1) hexString.append('0')
      hexString.append(hex)
      i += 1
    }
    hexString.toString
  }
}